ABC148 F - Playing Tag on Tree(思维+bfs)

题意:

在这里插入图片描述
在这里插入图片描述

解法:

后手要追先手.:
d[i]表示先手到达点i的最小时间.
dd[i]表示后手到达点i的最小时间.
d[]和dd[]可以用bfs计算出来.


枚举点i,如果dd[i]>d[i],那么在点i不能追到,
则可以用dd[i]更新ans.

最后答案为ans-1.1是因为最后一步先手会被迫走到后手的格子上,
此时后手是不用走的.

code:

#include<bits/stdc++.h>
#define int long long
#define PI pair<int,int>
using namespace std;
const int maxm=2e6+5;
vector<int>g[maxm];
int d[maxm],dd[maxm];
int n,u,v;
int ans;
void bfs(int st,int d[]){
    
    
    for(int i=1;i<=n;i++){
    
    
        d[i]=-1;
    }
    queue<int>q;
    q.push(st);
    d[st]=0;
    while(q.size()){
    
    
        int x=q.front();q.pop();
        for(int v:g[x]){
    
    
            if(d[v]!=-1)continue;
            d[v]=d[x]+1;
            q.push(v);
        }
    }
}
void solve(){
    
    
    cin>>n>>u>>v;
    for(int i=1;i<n;i++){
    
    
        int a,b;cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    bfs(u,d);
    bfs(v,dd);
    int ans=0;
    for(int i=1;i<=n;i++){
    
    
        if(dd[i]>d[i]){
    
    
            ans=max(ans,dd[i]);
        }
    }
    cout<<ans-1<<endl;
}
signed main(){
    
    
    ios::sync_with_stdio(0);
    solve();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/115218166
tag
今日推荐