題目大意:
給定一棵樹,有兩個人輪流拆除樹上的葉子節點,摘除編號爲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;
}