Codeforces Game On Leaves(树)

在这里插入图片描述
题目大意:
给定一棵树,有两个人轮流拆除树上的叶子节点,摘除编号为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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章