【POJ 2425】A Chess Game SG函数
题目
【题目大意】
多组测试数据.
给定一张有向无环图
G=(V,E)
,其中节点的标号为
0
到
多个询问,对于给定
m
个点
【数据范围】
1≤n≤1000
1≤M≤10
分析
SG函数直接看百度的,这是裸的ICG.
代码
也难得在POJ上跑最快……
#include <cstdio>
#include <cstring>
#include <cctype>
const int N=1024;
int n;
int mp[N][N];
int vis[N];
int sg[N];
int m;
inline int read(void)
{
int x=0; char c=getchar();
for (;!isdigit(c);c=getchar());
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x;
}
void dfs(int now)
{
if (~sg[now]) return;
for (int nxt=1;nxt<=n;nxt++)
if (mp[now][nxt]) dfs(nxt);
memset(vis,0,sizeof vis);
for (int nxt=1;nxt<=n;nxt++)
if (mp[now][nxt]) vis[sg[nxt]]++;
int cur; for (cur=0;vis[cur];cur++);
sg[now]=cur;
}
int main(void)
{
for (;~scanf("%d",&n);)
{
int x; memset(mp,0,sizeof mp);
for (int i=1;i<=n;i++)
{
x=read();
for (int j=1;j<=x;j++)
mp[i][read()+1]++;
}
memset(sg,-1,sizeof sg);
for (int i=1;i<=n;i++)
if (!~sg[i]) dfs(i);
int sum;
for (;;)
{
if (!(m=read())) break;
sum=0; for (int i=1;i<=m;i++) sum^=sg[read()+1];
if (sum) printf("WIN\n"); else printf("LOSE\n");
}
}
return 0;
}