转载请注明出处:http://blog.youkuaiyun.com/vmurder/article/details/42653921
其实我就是觉得原创的访问量比未授权盗版多有点不爽233。。。
题意:给一个有向无环图(拓扑图),有若干个棋子,两人轮流操作,每次可以把其中某棋子沿图走一步,无法操作者输。
题解:SG函数裸题,模板题
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 1005
using namespace std;
bool map[N][N];
int n,q,d[N];
int SG[N];
void dfs(int x)
{
int i,j,k;
bool vis[N]={0};
for(i=0;i<n;i++)if(map[x][i])
{
if(SG[i]==-1)dfs(i);
vis[SG[i]]=1;
}
for(i=0;vis[i];i++);
SG[x]=i;
}
int main()
{
// freopen("test.in","r",stdin);
int i,j,k,a;
while(scanf("%d",&n)!=EOF)
{
memset(map,0,sizeof(map));
memset(SG,-1,sizeof(SG));
for(i=0;i<n;i++)
{
scanf("%d",&d[i]);
for(j=1;j<=d[i];j++)
{
scanf("%d",&a);
map[i][a]=1;
}
}
for(i=0;i<n;i++)if(SG[i]==-1)dfs(i);
while(scanf("%d",&q),q)
{
k=0;
while(q--)
{
scanf("%d",&a);
k^=SG[a];
}
if(k)puts("WIN");
else puts("LOSE");
}
}
return 0;
}