黑黑白白

题目描述 

艮为山,动静得宜,适可而止;兑为泽,刚内柔外,上下相和。
艮卦:兼山,艮;君子以思不出其位。财帛常打心头走,可惜眼前难到手,不如意时且忍耐,逢着闲事休开口。
兑卦:丽泽,兑;君子以朋友讲习。这个卦象真可取,觉着做事不费力,休要错过这机关,事事觉得随心意。
有一个棋子放在一颗有根树的根上。你和算卦先生轮流把这个棋子向所在点的其中一个儿子移动(只能移动到儿子)。不能再移动就算失败(即棋子所在节点没有儿子)。
算卦先生来问你,如果你先手,你是否有必胜策略? 

输入描述:

第一行一个数 TT,表示有 TT 组数据。
接下去每组数据的第一行有两个数 n,rn,r ,表示树有 nn 个节点,其中 rr 为根节点编号(从 11 开始编号)。 
接下去 n - 1n1 行每行两个数字 u, vu,v ,表示点 uu 和 vv 之间有一条边。 

输出描述:

每组数据输出一行,\texttt{"Gen"}"Gen" 表示先手有必胜策略,\texttt{"Dui"}"Dui" 表示没有。 

输入

2
3 1
1 2
2 3
5 4
1 2
1 3
3 4
4 5

输出

Dui
Gen

备注:

1 \leq T \leq 101T10
1 \leq n \leq 100001n10000
1 \leq r \leq n1rn
// 树型博弈模板题
#include<bits/stdc++.h> using namespace std; const int MAXM = 2e4 + 7; int head[MAXM], ver[MAXM], nex[MAXM], tot; int n, r; void add(int x, int y) { ver[++tot] = y; nex[tot] = head[x]; head[x] = tot; } bool dfs(int x, int fa) { for (int i = head[x]; i; i = nex[i]) { int y = ver[i]; if (y == fa) continue; if (!dfs(y, x)) return true; } return false; } int main() { int x, y, T; cin >> T; while (T--) { tot = 0; memset(head, 0, sizeof(head)); cin >> n >> r; for (int i = 1; i <= n - 1; i++) { cin >> x >> y; add(x, y); add(y, x); } if (dfs(r, 0)) cout << "Gen" << endl; else cout << "Dui" << endl; } return 0; }
posted @ 2020-07-22 22:04  HighLights  阅读(267)  评论(0)    收藏  举报