题意:
解法:
后手要追先手.
设:
d[i]表示先手到达点i的最小时间.
dd[i]表示后手到达点i的最小时间.
d[]和dd[]可以用bfs计算出来.
枚举点i,如果dd[i]>d[i],那么在点i不能追到,
则可以用dd[i]更新ans.
最后答案为ans-1.
减1是因为最后一步先手会被迫走到后手的格子上,
此时后手是不用走的.
code:
#include<bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e6+5;
vector<int>g[maxm];
int d[maxm],dd[maxm];
int n,u,v;
int ans;
void bfs(int st,int d[]){
for(int i=1;i<=n;i++){
d[i]=-1;
}
queue<int>q;
q.push(st);
d[st]=0;
while(q.size()){
int x=q.front();q.pop();
for(int v:g[x]){
if(d[v]!=-1)continue;
d[v]=d[x]+1;
q.push(v);
}
}
}
void solve(){
cin>>n>>u>>v;
for(int i=1;i<n;i++){
int a,b;cin>>a>>b;
g[a].push_back(b);
g[b].push_back(a);
}
bfs(u,d);
bfs(v,dd);
int ans=0;
for(int i=1;i<=n;i++){
if(dd[i]>d[i]){
ans=max(ans,dd[i]);
}
}
cout<<ans-1<<endl;
}
signed main(){
ios::sync_with_stdio(0);
solve();
return 0;
}