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