传送门
题意: 就是每次在一颗有根树上有一个棋子, 两个人轮流的移动棋子, 且每次只能向其儿子移动, 不能移动者输掉比赛, 给定这个树的形态, 问是否先手必胜.
思路: 稍微了解一点sg博弈的都知道, 这就是sg博弈的最开始的引入呀, 就是在一副有向图上进行移动棋子, 不能移动者输掉, 所以我们直接引用sg博弈的含义. 对于sg[x] = 0的点表示该点是必输态, 那么能移动到必输状态的点就是必赢态, 反过来也成立, 即可以移动到必赢态的就是必输态. 所以这棵树的所有的叶子节点就是必输态, 那么根据这个性质可以直接递归的处理下即可, 具体细节请看代码.
AC Code
const int maxn = 1e5+5;
vector<int>g[maxn];
int sg[maxn];
void dfs(int u, int fa) {
sg[u] = 0;
for (int i = 0 ; i < sz(g[u]) ; i ++) {
int to = g[u][i];
if (to == fa) continue;
dfs(to, u);
if (!sg[to]) sg[u] = 1;
}
}
void solve()
{
int n, r;
cin >> n >> r;
for (int i = 1 ; i < n ; i ++) {
int u, v;
cin >> u >> v;
g[u].pb(v);
g[v].pb(u);
}
dfs(r, -1);
printf("%s\n", sg[r]?"Gen":"Dui");
for (int i = 1 ; i <= n ; i ++) g[i].clear();
}