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;
}