树上博弈——A tree game HDU - 3094

在这里插入图片描述
在这里插入图片描述
题意:删边并去除与跟不想连的边,最后不能移动的人失败
题解:每个根节点的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;
}

猜你喜欢

转载自blog.csdn.net/qq_40240576/article/details/82777602
今日推荐