Educational Codeforces Round 22 C. The Tag Game

题目链接:Educational Codeforces Round 22 C. The Tag Game

题意:

给你一棵树,Alice在顶点1,Bob在顶点x,每人轮流走一步,每次可以去相邻的节点。

如果Alice走到Bob的位置,游戏结束。

Bob想让游戏的轮数尽可能多,Alice想让游戏的轮数尽可能少。

双方都采取最优策略。问游戏持续多久。

题解:

显然,Bob要向以1为根的树深度最深的节点走。

不过有可能Bob在其他的子树上,所以dfs一下每个节点的最大深度,

然后判断一下Bob能走到的最大深度就行了。

 1 #include<bits/stdc++.h>
 2 #define F(i,a,b) for(int i=(a);i<=(b);++i)
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int N=2e5+7;
 7 int n,m,x,y,mx[N],dep[N],ans,f[N];
 8 vector<int>g[N];
 9 
10 void dfs(int x=1,int cnt=0,int fa=0)
11 {
12     dep[x]=cnt,mx[x]=cnt,f[x]=fa;
13     for(auto &it:g[x])if(it!=fa)
14         dfs(it,cnt+1,x),mx[x]=max(mx[x],mx[it]);
15 }
16 
17 int main()
18 {
19     scanf("%d%d",&n,&m);
20     F(i,1,n-1)
21     {
22         scanf("%d%d",&x,&y);
23         g[x].push_back(y);
24         g[y].push_back(x);
25     }
26     dfs(),ans=mx[m];
27     int now=m;
28     while(f[now]!=1)
29     {
30         if(dep[now]>dep[m]-dep[now])ans=mx[now];
31         now=f[now];
32     }
33     printf("%d
",ans*2);
34     return 0;
35 }
View Code
原文地址:https://www.cnblogs.com/bin-gege/p/7126624.html