1 条题解

  • 0
    @ 2026-4-29 17:23:08

    一、核心结论(直接看这个)

    这道题不需要DFS、不需要博弈DP,只靠两个条件就能判断胜负:

    设:

    • deg[x]deg[x]:特殊节点 xx 的度数
    • nn:树的总节点数

    最终判定规则

    1. 如果 xx 本身就是叶子(deg[x]1\boldsymbol{deg[x] \le 1}先手 Ayush 直接获胜(第一步就能拿走 xx)。

    2. 否则(xx 不是叶子)

      • nn奇数 → 后手 Ashish
      • nn偶数 → 先手 Ayush

    二、完整证明(为什么是对的)

    1. 特殊情况:xx 是叶子

    • 叶子可以直接被拿走
    • 先手第一步直接取 xx 获胜 → Ayush 必胜

    2. 一般情况:xx 不是叶子

    想要取到 xx必须先把 xx 周围的点全部删光,让 xx 变成叶子。

    这个过程会恰好删除 n1n-1 个节点

    • 总步数由总节点数的奇偶性决定
    • 因为两人轮流取,每次取一个点
    • 最后一步(取 xx)的人就是胜者

    谁面对偶数个节点谁赢


    三、标程代码解释

    #include <bits/stdc++.h>
    using namespace std;
    
    #define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    const int N = 2e5 + 5;
    
    int n, x;
    int deg[N]; // 只需要度数,不需要存图
    
    int32_t main()
    {
    	IOS;
    	int t;
    	cin >> t;
    	while(t--)
    	{
    		memset(deg, 0, sizeof(deg));
    		cin >> n >> x;
            
    		// 读边,统计度数
    		for(int i = 1; i <= n - 1; i++)
    		{
    			int u, v;
    			cin >> u >> v;
    			deg[u]++;
    			deg[v]++;
    		}
    
    		// 核心逻辑
    		if(deg[x] <= 1) 
    			cout << "Ayush\n";    // x 是叶子,先手直接赢
    		else
    		{
    			if(n % 2 == 1)
    				cout << "Ashish\n"; // n 奇数,后手赢
    			else
    				cout << "Ayush\n";  // n 偶数,先手赢
    		}
    	}
    	return 0;
    }
    

    四、样例解释

    样例 1

    输入:

    3 1
    2-1  3-1
    
    • deg[1]=2deg[1] = 2(不是叶子)
    • n=3n=3(奇数) → Ashish 胜

    样例 2

    输入:

    3 2
    1-2  1-3
    
    • deg[2]=1deg[2] = 1(是叶子) → Ayush 直接胜

    五、一句话记忆(比赛秒写版)

    1. x 是叶子 → 先手胜
    2. 不是叶子
      • n 奇 → 后手胜
      • n 偶 → 先手胜
    • 1

    信息

    ID
    6712
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者