HDOJ 1524 SG函数标准模板题

SG的模板题,不多说。

这里采用记忆化深搜优化。Time=15ms还不错。

#include<iostream>
#include<algorithm>
using namespace std;

struct EDGE
{
 	   int v,next;
}E[11111111];

int ptr[1111],Enum;
int sg[1111];
void addEdge( int u,int v )
{
 	 E[Enum].v=v;
 	 E[Enum].next=ptr[u];
 	 ptr[u]=Enum++;
}

int SG( int sit )
{
 	if( sg[sit]!=-1 )
 		return sg[sit];
 	int flag[1111];
 	memset( flag,0,sizeof(flag) );
 	for( int i=ptr[sit];i!=-1;i=E[i].next )
	 	 flag[SG(E[i].v)]=1;
	for( int i=0;i<1111;i++ )
		 if( flag[i]==0 )
		 	 return sg[sit]=i;
}

int main()
{
 	int N;
 	while( scanf("%d",&N)!=EOF )
 	{
	 	   Enum=0;
	 	   memset( ptr,-1,sizeof(ptr) );
	 	   for( int i=0;i<N;i++ )
	 	   {
		   		int outp,v;
		   		scanf( "%d",&outp );
		   		for( int j=0;j<outp;j++ )
		   		{
		   			 scanf( "%d",&v );
		   			 addEdge(i,v);
	  			}
		   }
		   memset( sg,-1,sizeof(sg) );
		   int chessnum;
		   while( scanf("%d",&chessnum)!=EOF,chessnum )
		   {
		   		  int xo=0;int sit;
		   		  for( int i=0;i<chessnum;i++ )
		   		  {
				  	   scanf("%d",&sit);
				  	   xo^=SG(sit);
		   		  }
  		  	  	  printf( "%s\n",xo?"WIN":"LOSE" );
 		   }
  	}
  	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值