- 新增一条树边,等价于,在原先的有向图游戏上,对于每个状态,都连一条通向该单一根节点状态的边,故所有状态的SG函数值都+1,利用有向图游戏的组合求SG函数值
点击查看代码
#include <bits/stdc++.h>
using namespace std;
vector<int>a[300005];
int sg[300005],f[300005];
int read1()
{
char cc=getchar();
while(!(cc>=48&&cc<=57))
{
if(cc=='-')
{
break;
}
cc=getchar();
}
bool f=false;
int s=0;
if(cc=='-')
{
f=true;
}
else
{
s=cc-48;
}
while(1)
{
cc=getchar();
if(cc>=48&&cc<=57)
{
s=s*10+cc-48;
}
else
{
break;
}
}
if(f==true)
{
s=-s;
}
return s;
}
void dfs(int n1,int fa)
{
sg[n1]=0;
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa)
{
dfs(a[n1][i],n1);
sg[n1]^=(sg[a[n1][i]]+1);
}
}
}
void dp(int n1,int fa)
{
f[n1]=sg[n1];
if(fa!=0)
{
f[n1]^=((f[fa]^(sg[n1]+1))+1);
}
for(int i=0;i<a[n1].size();i++)
{
if(a[n1][i]!=fa)
{
dp(a[n1][i],n1);
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n=read1();
for(int i=1;i<=n;i++)
{
a[i].clear();
}
for(int i=1;i<n;i++)
{
int u,v;
u=read1();
v=read1();
a[u].push_back(v);
a[v].push_back(u);
}
dfs(1,0);
f[1]=sg[1];
dp(1,0);
for(int i=1;i<=n;i++)
{
if(f[i]==0)
{
cout<<'B';
}
else
{
cout<<'A';
}
}
cout<<endl;
}
return 0;
}