Codeforces Round #646 (Div. 2)【C. Game On Leaves 題解】

Z發表於2020-06-01

題意分析

關於這道題,意思就是兩個人摘葉子,誰最後摘到編號為x的誰就贏了。既然是葉子,說明其最多隻有一個分支,由於題目上說了是無向圖,那就是度數小於等於1的節點。也就是一步步移除度數小於等於1的節點,直到將編號為x的節點刪掉遊戲才結束。
那麼我們可以將x這個節點作為根節點,初始時這棵樹的樣子如下:

兩個人摘來摘去,誰也不想讓對方贏,最終的結果必然是這個樣子。(這是當節點總數大於等於3的情況)

這樣我們就不難發現,當節點x的度數大於等於2時,除了上圖中的那三個點,還剩n-3個點,若n-3為偶數,那麼最終肯定是後摘的那個人贏;反之就是先摘的那個人贏;
當節點x的度數小於2時,那一定是先摘的那個人贏。
分析完了,下面看程式碼。

程式碼

#include<iostream>
using namespace std;
int t, n, x, u, v;
int main()
{
    cin >> t;
    while(t--)
    {
        cin >> n >> x;
        int degree = 0;         //x這個節點的度數
        for(int i = 0; i < n - 1;i ++)      //注意這裡,是n-1行
        {
            cin >> u >> v;
            if(u == x || v == x)        //由於題目中說不會有環,故此處直接這樣判斷
                degree++;
        }
        if(degree <= 1)         //度數為1,肯定先開始的先贏
            puts("Ayush");
        else
        {
            if((n - 3) % 2 == 0)
                puts("Ashish");
            else
                puts("Ayush");
        }


    }
    return 0;
}

相關文章