题目大意:
给定一棵树,有两个人轮流拆除树上的叶子节点,摘除编号为x的节点的人获胜,问最后谁会获胜
解题思路:
以x为根节点,求x的所有孩子节点的数量,如果数量为奇数,则Ayush获胜,否则Ashish获胜,这里需要注意一种特殊情况,即第一个人就能取得胜利,所有记录直接与x相连的节点的数量
代码:
#include <bits/stdc++.h>
using namespace std;
int t,n,x,f[1010],sum[1010];
vector<int> arr[1010];
void dfs(int u,int fa)
{
for(auto v:arr[u])
if(v!=fa)
{
dfs(v,u);
sum[u]+=sum[v]+1;
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
int cnt=0;
memset(f,0,sizeof(f));
memset(sum,0, sizeof(sum));
for(int i=0;i<1010;++i)
arr[i].clear();
scanf("%d%d",&n,&x);
for(int i=0;i<n-1;++i) {
int u, v;
scanf("%d%d", &u, &v);
if (u == x || v == x) cnt++;
arr[u].push_back(v);
arr[v].push_back(u);
}
dfs(x,-1);
if(cnt==0||cnt==1)
{
puts("Ayush");
continue;
}
if(sum[x]%2==0) puts("Ashish");
else puts("Ayush");
}
return 0;
}