思路:每个人都走最优,是不会走回头路的(B来回走可以看作在一点不动),那么我们可以先求下A,B分别到所有节点的最短时间,对于每个节点如果B走的时间小于A走的时间那B就可以走到这个。所以要在先求了从根节点到其他节点的max距离之后,再逆序遍历其x位置走的距离。 因为B走的位置必须在A之前走。 就是说可能相遇,得排除相遇这种情况。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
int fa[N],dep[N],len[N];
vector<int>adj[N];
int n,x;
int dfs(int cur,int father,int lens)//dfs遍历所有点
{
dep[cur]=lens;
len[cur]=0;
fa[cur]=father;
for(int i=0;i<adj[cur].size();i++)
{
int ne=adj[cur][i];
if(ne==father)continue;
len[cur]=max(len[cur],dfs(ne,cur,lens+1));
}
return len[cur]+1;
}
int main()
{//freopen("t.txt","r",stdin);
scanf("%d%d",&n,&x);
int a,b;
for(int i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
adj[a].push_back(b);
adj[b].push_back(a);
}
fa[1]=0;
dfs(1,0,0);
int ll=0;
int ans=dep[x]+len[x];
while((x=fa[x])!=0)//逆序遍历
{
ll++;
if(dep[x]<=ll)break;
ans=max(ans,dep[x]+len[x]);
}
printf("%d\n",ans*2);
}