[AGC017D]Game on Tree
Posted skylee03
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AGC017D]Game on Tree相关的知识,希望对你有一定的参考价值。
[AGC017D]Game on Tree
题目大意:
一棵(n(nle10^5))个结点的树。A和B轮流进行游戏,A先手。每次删掉一棵子树,根结点不能删。最先不能操作的人输,问最后谁赢。
思路:
根据树上删边游戏的经典结论,根结点的sg值等于各子结点的sg值+1后的异或和。
源代码:
#include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e5+1;
std::vector<int> e[N];
inline void add_edge(const int &u,const int &v) {
e[u].push_back(v);
e[v].push_back(u);
}
int dfs(const int &x,const int &par) {
int sg=0;
for(auto &y:e[x]) {
if(y==par) continue;
sg^=dfs(y,x)+1;
}
return sg;
}
int main() {
const int n=getint();
for(register int i=1;i<n;i++) {
add_edge(getint(),getint());
}
puts(dfs(1,0)?"Alice":"Bob");
return 0;
}
以上是关于[AGC017D]Game on Tree的主要内容,如果未能解决你的问题,请参考以下文章
Atcoder #017 agc017 D.Game on Tree 树上NIM 博弈
codeforces 220 C. Game on Tree