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\n",ans*2); 34 return 0; 35 }