【题目】http://codeforces.com/problemset/problem/813/C
【题意】a抓b,a在根节点,b在某个节点上,b和a轮流移动,问最晚a什么时候抓到b
【思路】dfs求出根节点到每个点的距离,dfs2求出b到每个点的距离,根据根节点到点的距离从大到小排序,只要b到这个点的距离比a到这个点的距离小,那么b到这个点的距离就是答案。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int M=2e5+10;
int n,x;
struct node
{
int u,v;
int nxt;
}edge[M*2];
struct node2
{
int d1,dx;
}point[M];int pi;
int head[M];
int ei;
int d1[M];
int d2[M];
int vis[M];
void addedge(int u,int v)
{
edge[ei].u=u,edge[ei].v=v;
edge[ei].nxt=head[u];
head[u]=ei++;
}
void init()
{
memset(head,-1,sizeof(head));
ei=0;
pi=0;
}
void dfs1(int nw,int ds)
{
vis[nw]=1;
d1[nw]=ds;
for(int i=head[nw];i!=-1;i=edge[i].nxt)
{
int v=edge[i].v;
if(vis[v]==1)continue;
dfs1(v,ds+1);
}
}
void dfs2(int nw,int ds)
{
vis[nw]=1;
d2[nw]=ds;
for(int i=head[nw];i!=-1;i=edge[i].nxt)
{
int v=edge[i].v;
if(vis[v]==1)continue;
dfs2(v,ds+1);
}
}
bool cmp(node2 a,node2 b)
{
return a.d1>b.d1;
}
int main()
{
init();
scanf("%d%d",&n,&x);
for(int i=0;i<n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
addedge(u,v);
addedge(v,u);
}
memset(vis,0,sizeof(vis));
dfs1(1,0);
memset(vis,0,sizeof(vis));
dfs2(x,0);
for(int i=1;i<=n;i++)
{
point[i]={d1[i],d2[i]};
}
sort(point+1,point+n+1,cmp);
int ans=0;
for(int i=1;i<=n;i++)
{
if(point[i].d1>point[i].dx)
{
ans=point[i].d1;
break;
}
}
printf("%d",ans*2);
}