image.png
思路:dfs找到x和y与所有点的距离,且x对于某个点的距离一定要大于y对那个点的距离(即为x在y“后面”追);

用vector写邻接表

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n,x,y;
  4. void dfs(vector<vector<int> > &g, vector<int> &d, int u, int fa, int step)
  5. {
  6. for(auto v: g[u])
  7. {
  8. if(v==fa) continue;
  9. d[v]=step+1;
  10. dfs(g,d,v,u,step+1);
  11. }
  12. }
  13. int main()
  14. {
  15. cin>>n>>x>>y;
  16. vector<vector<int> >g(n+1); //g从1开始
  17. for(int i=1;i<=n;i++)
  18. {
  19. int a,b;
  20. cin>>a>>b;
  21. g[a].push_back(b);
  22. g[b].push_back(a);
  23. }
  24. vector<int>dx(n+1,0); //dx从1开始
  25. vector<int>dy(n+1,0);
  26. dfs(g,dx,x,-1,0);
  27. dfs(g,dy,y,-1,0);
  28. int ans=0;
  29. for(int i=1;i<=n;i++)
  30. if(dx[i]>dy[i])
  31. ans=max(ans,dx[i]);
  32. cout<<ans<<endl;
  33. return 0;
  34. }

数组模拟邻接表

  1. // 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
  2. int h[N], e[N], ne[N], idx;
  3. // 添加一条边a->b
  4. void add(int a, int b)
  5. {
  6. e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
  7. }
  8. // 初始化
  9. idx = 0;
  10. memset(h, -1, sizeof h); //不要忘记对h[]的初始化!
  1. int dfs(int u)
  2. {
  3. st[u] = true; // st[u] 表示点u已经被遍历过
  4. for (int i = h[u]; i != -1; i = ne[i])
  5. {
  6. int j = e[i];
  7. if (!st[j]) dfs(j);
  8. }
  9. }
  1. queue<int> q;
  2. st[1] = true; // 表示1号点已经被遍历过
  3. q.push(1);
  4. while (q.size())
  5. {
  6. int t = q.front();
  7. q.pop();
  8. for (int i = h[t]; i != -1; i = ne[i])
  9. {
  10. int j = e[i];
  11. if (!st[j])
  12. {
  13. st[j] = true; // 表示点j已经被遍历过
  14. q.push(j);
  15. }
  16. }
  17. }