hdu 3094 A tree game
http://acm.hdu.edu.cn/showproblem.php?pid=3094
树上删边游戏
一条链的情况:SG分别是0,1,2,……,相当于Nim取石子游戏
那么把边看作石子,树可看做若干堆石子
所以叶节点的SG=0,其余节点的SG等于子节点SG+1的异或和
#include<cstdio> #include<cstring> using namespace std; #define N 100001 int tot,front[N],to[N<<1],nxt[N<<1]; int f[N]; void add(int u,int v) { to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; } void dfs(int u,int fa) { int t; for(int i=front[u];i;i=nxt[i]) { t=to[i]; if(t==fa) continue; dfs(t,u); f[u]^=(f[t]+1); } } int main() { int T,n,u,v; scanf("%d",&T); while(T--) { scanf("%d",&n); tot=0; memset(front,0,sizeof(front)); memset(f,0,sizeof(f)); for(int i=1;i<n;++i) { scanf("%d%d",&u,&v); add(u,v); } dfs(1,0); puts(f[1] ? "Alice" : "Bob"); } return 0; }