poj 2425

题意是说在一个有n个点的图中有m个棋子,两个人可以轮流顺着边移动棋子,边是有向的,谁不能移动就算输了。

显然一题简单的组合博弈题,将每个棋子看做一个子游戏,求出其sg值,之后异或就知道先手能不能赢了,我采用的是邻接表+记忆化搜索sg值。

#include
#include
#include
#include
#include
using namespace std;
struct nd
{
	int num,next;
}e[1000005];
int head[1005],sg[1005];

int mex(int n)
{
	if(sg[n]!=-1)
		return sg[n];
	bool vd[1005];
	memset(vd,0,sizeof(vd));
	for(int i=head[n];i>=0;i=e[i].next)
	{
		sg[e[i].num]=mex(e[i].num);
		vd[sg[e[i].num]]=1;
	}
	for(int i=0;1;i++)
	{
		if(!vd[i])
		{
			sg[n]=i;
			break;
		}
	}
	return sg[n];
}
int main()
{
	int n,m,k,x,cn;
	while(scanf("%d",&n)!=EOF)
	{
		k=0;
		memset(head,-1,sizeof(head));
		for(int i=0;i


你可能感兴趣的:(博弈)