题意:删边并去除与跟不想连的边,最后不能移动的人失败
题解:每个根节点的SG为0,中间节点的SG为所有根节点SG值加一的亦或和。
代码:
#include<bits/stdc++.h>
#include<cstring>
using namespace std;
const int maxn = 1e5+50;
vector<int> G[maxn];
int sg[maxn];
int get_sg(int u,int fa)
{
if(sg[u] != -1)
return sg[u];
sg[u] = 0;
for(int i = 0 ; i < G[u].size(); i++)
{
int v = G[u][i];
if(v == fa) continue;
get_sg(v,u);
sg[u] = (sg[u]^(1+sg[v]));
}
return sg[u];
}
int main()
{
int T,n,u,v;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i = 1 ; i <= n ; i++)
{
G[i].clear();
sg[i] = -1;
}
for(int i = 1 ; i < n ; i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
get_sg(1,0);
if(sg[1]>0) printf("Alice\n");
else printf("Bob\n");
}
return 0;
}