题目链接在这里:​​Problem - K - Codeforces​

这题是一道很好的树上博弈的题目,关于博弈论的问题,要先从简单的特殊情况入手,找到一些必胜或者必败的局面,再慢慢推到复杂的情况。因为复杂的状态都是由简单的状态叠加起来的。

关于此题的题解可以看这个博客:(7条消息) MUV LUV UNLIMITED(树上博弈 奇偶性)_jkchen's Haven

1 #include "bits/stdc++.h"
2 using namespace std;
3 const int MAX=2e6+5;
4 int t,n;
5 int tot,head[MAX],adj[MAX],nxt[MAX],son[MAX];
6 bool flag,ff[MAX];
7 void addedge(int u,int v){
8 tot++;
9 adj[tot]=v;
10 nxt[tot]=head[u];
11 head[u]=tot;
12 }
13 void dfs(int x,int deep){
14 //cout<<x<<endl;
15 int i,j,zt=0;
16 if (x==1){
17 if (son[x]==1) deep++;
18 if ((deep-1)%2==1) flag=false;
19 return;
20 }
21 if (son[x]>1){
22 if ((deep-1)%2==1) flag=false;
23 return;
24 }
25 dfs(adj[head[x]],deep+1);
26 }
27 int main(){
28 freopen ("k.in","r",stdin);
29 freopen ("k.out","w",stdout);
30 int i,j;
31 scanf("%d",&t);
32 while (t--){
33 scanf("%d",&n);tot=0;
34 for (i=1;i<=n;i++) son[i]=head[i]=0;
35 for (i=2;i<=n;i++){
36 scanf("%d",&j);
37 addedge(i,j);
38 //cout<<i<<"-->"<<j<<endl;
39 son[j]++;
40 }
41 flag=true;
42 for (i=1;i<=n;i++)
43 if (son[i]==0)
44 dfs(i,1);
45 if (flag) printf("Meiya\n");
46 else printf("Takeru\n");
47 }
48 return 0;
49