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

本文介绍了一种求解树形图中从根节点到指定节点x的最远路径长度的算法。通过深度优先搜索(DFS)计算每个节点到根节点的距离及可达的最大深度,进而找出从指定节点出发,在被抓到前能到达的最大深度,最终结果为该最大深度的两倍。文章提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题解】

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值