题解:AT_abc148_f [ABC148F] Playing Tag on Tree
思路
跑两次最短路,一次以逃跑者为根,一次以追捕者为根,如果在
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n,su,sv,u[N],v[N],ans;
vector<int> edge[N];
void dfs(int dis[],int x,int fa){
for(auto i:edge[x]){
if(i==fa){
continue;
}
dis[i]=dis[x]+1;
dfs(dis,i,x);
}
return;
}
signed main(){
scanf("%lld%lld%lld",&n,&su,&sv);
for(int i=1;i<n;i++){
int x,y;
scanf("%lld%lld",&x,&y);
edge[x].push_back(y);
edge[y].push_back(x);
}
dfs(u,su,0);
dfs(v,sv,0);
for(int i=1;i<=n;i++){
if(u[i]<v[i]){
ans=max(ans,v[i]);
}
}
printf("%lld",ans-1);
return 0;
}