CodeForces - 813C :The Tag Game(思维+树)

【题解】

跑出根结点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;
}

猜你喜欢

转载自blog.csdn.net/qq_41117236/article/details/94657549