【CodeForces】813 C The Tag Game

【题目】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);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值