【POJ 2425】A Chess Game SG函数

来源:互联网 发布:整理客户资料的软件 编辑:程序博客网 时间:2024/04/29 08:23

【POJ 2425】A Chess Game SG函数

题目

【题目大意】
多组测试数据.
给定一张有向无环图G=(V,E),其中节点的标号为0n1.
多个询问,对于给定m个点x1,x2,...,xm,每次可以将一个点u跳到它连边的对应点v,谁不能跳谁就输了. 现在询问先手方胜还是负.

【数据范围】
1n1000
1M10

分析

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;}
0 0
原创粉丝点击