Nanami and Subtree of Tree

  • 新增一条树边,等价于,在原先的有向图游戏上,对于每个状态,都连一条通向该单一根节点状态的边,故所有状态的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;
}
posted @ 2024-07-02 19:20  D06  阅读(3)  评论(0编辑  收藏  举报