Game On Leaves(博弈)

116 阅读2分钟

Problem - 1363C - Codeforces

题目描述

现在给你一个联通无向图,共有 nn 个点,n1n-1 条边,图内没有环,并且有一个特殊节点 xx

现在 Ayush 和 Ashish 进行一场游戏,由 Ayush 先手,每一步选择一个度数小于等于 11 的节点并将其与其所连的边删去。

谁先删去特殊节点谁便取胜,给出 tt 个情况和每次的点数 nnn1n-1 条边,若二人均采取最优操作,判断谁会取胜。

输入样例

2
3 1
2 1
3 1
3 2
1 2
1 3

输出样例

Ashish
Ayush

题目分析

这是一道与图相关的 简单博弈题

首先我们可以知道若特殊点本身就是度数小于等于 11 的点即叶节点,那么先手删去这个点便取得胜利。否则当前选手需要尽量避免让特殊点成为可以被后手删去的叶节点。在这个前提下,我们便可以知道此时的情况便为你删一次无关点我删一次无关点,而无关点的总数便为 总点数-2,在面对仅剩特殊节点和仅一条与其相连的边之前,我们可以删除任意一个与不会造成必胜局面的节点和其所连边,而谁先遇到这种必胜局面谁便可以删去特殊点取得胜利,而这个结果我们可以通过无关点总点数的奇偶性判断。

落实到代码上,我们只需要统计与特殊节点相连的节点个数,再进行判断即可。

Accept代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1010;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);

    int t; cin >> t;
    while (t --)
    {
        int n, x;
        cin >> n >> x;
        int k = 0;
        for (int i = 1; i < n; i ++)
        {
            int a, b;
            cin >> a >> b;
            if (a == x || b == x) k ++;
        }
        if (k == 1 || k == 0) cout << "Ayush\n";
        else
        {
            n -= 2;
            if (n % 2 == 0) cout << "Ayush\n";
            else cout << "Ashish\n";
        }
    }
    return 0;
}