
思路:dfs找到x和y与所有点的距离,且x对于某个点的距离一定要大于y对那个点的距离(即为x在y“后面”追);
用vector写邻接表
#include <bits/stdc++.h>using namespace std;int n,x,y;void dfs(vector<vector<int> > &g, vector<int> &d, int u, int fa, int step){for(auto v: g[u]){if(v==fa) continue;d[v]=step+1;dfs(g,d,v,u,step+1);}}int main(){cin>>n>>x>>y;vector<vector<int> >g(n+1); //g从1开始for(int i=1;i<=n;i++){int a,b;cin>>a>>b;g[a].push_back(b);g[b].push_back(a);}vector<int>dx(n+1,0); //dx从1开始vector<int>dy(n+1,0);dfs(g,dx,x,-1,0);dfs(g,dy,y,-1,0);int ans=0;for(int i=1;i<=n;i++)if(dx[i]>dy[i])ans=max(ans,dx[i]);cout<<ans<<endl;return 0;}
数组模拟邻接表
// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点int h[N], e[N], ne[N], idx;// 添加一条边a->bvoid add(int a, int b){e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;}// 初始化idx = 0;memset(h, -1, sizeof h); //不要忘记对h[]的初始化!
int dfs(int u){st[u] = true; // st[u] 表示点u已经被遍历过for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];if (!st[j]) dfs(j);}}
queue<int> q;st[1] = true; // 表示1号点已经被遍历过q.push(1);while (q.size()){int t = q.front();q.pop();for (int i = h[t]; i != -1; i = ne[i]){int j = e[i];if (!st[j]){st[j] = true; // 表示点j已经被遍历过q.push(j);}}}
