Game On Leaves
题目:
Ayush and Ashish play a game on an unrooted tree consisting of nn nodes numbered 1 to n. Players make the following move in turns:
- Select any leaf node in the tree and remove it together with any edge which has this node as one of its endpoints. A leaf node is a node with degree less than or equal to 1.
A tree is a connected undirected graph without cycles.
There is a special node numbered x. The player who removes this node wins the game.
Ayush moves first. Determine the winner of the game if each player plays optimally.
输入:
The first line of the input contains a single integer t (1≤t≤10) — the number of testcases. The description of the test cases follows.
The first line of each testcase contains two integers nn and x (1≤n≤1000,1≤x≤n) — the number of nodes in the tree and the special node respectively.
Each of the next n−1 lines contain two integers u, v (1≤u,v≤n, u≠v), meaning that there is an edge between nodes u and v in the tree.
输出:
For every test case, if Ayush wins the game, print "Ayush", otherwise print "Ashish" (without quotes).
题目大意:
给出一个n个结点的无向连通图,每次只能去掉一个度为1的结点,问最后谁能将给出的特殊的结点去掉,有t个输入,每个输入第一行是n和k,之后是n-1行,k是特殊结点的编号,每一行代表的是两个节点间无向连通,第一次是Ayush开始走
思路:
因为两人均是最佳状态(即不会主动的使k的度为1),所以只有当k的度为1时,先走的Ayush会直接获胜;否则只有当只剩下一个结点与k结点相连时(即度变为1),才能去掉k结点,即剩下的n-2个结点是需要去掉的,一次只能去掉一个,所以只需判断n-2奇偶,就可得出答案。
代码:
#include <iostream> using namespace std; int main() { int t; cin >> t; while(t--) { int n, k; int cnt = 0; cin >> n >> k; for(int i = 1; i < n; i++) { int b, c; cin >> b >> c; if(b == k || c == k) cnt++; //统计k结点的度 } if(cnt <= 1) { //如果度小于等于1则直接获胜 cout << "Ayush" << endl; continue; } int x = n - 2; if(x % 2 == 0) { cout << "Ayush" << endl; }else { cout << "Ashish" << endl; } } return 0; }