【题解】
跑出根结点1到结点x的距离deep[x]和每个结点可到达的最大深度maxdeep[],在A从根结点出发抓到B之前,更新可以往回(往父结点)走再往下走能到达的深度,和不往回走的最大深度 比较的最大深度。答案即最大深度*2.
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
vector <int> vec[maxn];
int maxdeep[maxn],deep[maxn],pre[maxn];
void dfs(int pos,int fa,int d)
{
deep[pos]=maxdeep[pos]=d;
pre[pos]=fa;
int k=vec[pos].size();
for(int i=0;i<k;i++){
int x=vec[pos][i];
if(x!=fa){
dfs(x,pos,d+1);
maxdeep[pos]=max(maxdeep[pos],maxdeep[x]);
}
}
}
int main()
{
int n,x; scanf("%d%d",&n,&x);
memset(pre,0,sizeof(pre));
for(int i=1;i<n;i++){
int u,v; scanf("%d%d",&u,&v);
vec[u].push_back(v);
vec[v].push_back(u);
}
dfs(1,1,0);
int ans=2*maxdeep[x]; //不动
for(int i=0,k=x;i<deep[x];i++,k=pre[k]){
if(i<deep[k])
ans=max(2*maxdeep[k],ans);
else break;
}
printf("%d\n",ans);
return 0;
}