poj 2425

给出一个无环有向图,在节点上放几个棋子,两个人往有向路径移动,最后没的移动的输。
搜索求SG值。具体看代码

AC代码:

#include<stdio.h>
#include<string.h>
#define N 1010
struct pro
{
    int v,next;
} edge[1000*N];
int head[N],sg[N];
int e;
void init()
{
    memset(head,-1,sizeof(head));
    memset(sg,-1,sizeof(sg));
    e=0;
}
void addedge(int u,int v)
{
    edge[e].v=v;edge[e].next=head[u];
    head[u]=e++;
}
int getsg(int u)
{
    int i,v;
    if (sg[u]!=-1) return sg[u];
    int flag[N];
    memset(flag,0,sizeof(flag));
    for (i=head[u];i!=-1;i=edge[i].next)//所有后继节点sg
        flag[getsg(edge[i].v)]=1;
    for (i=0;flag[i];++i);//求sg[u]=met();
    sg[u]=i;
    return i;
}
int main ()
{
    int n,m,x,ans;
    int i,j,k;
    while (scanf("%d",&n)!=EOF)
    {
        init();//初始化
        for (i=0;i<n;++i)//构造有向图
        {
            scanf("%d",&m);
            for (j=0;j<m;++j)
            {
                scanf("%d",&x);
                addedge(i,x);
            }
            if (!m) sg[i]=0;//终止条件
        }
        while (scanf("%d",&m)&&m)//询问,m颗棋子
        {
            ans=0;
            for (i=0;i<m;++i)
            {
                scanf("%d",&x);
                ans^=getsg(x);//求各个棋子的sg值异或
            }
            if (ans) printf("WIN\n");
            else printf("LOSE\n");
        }
    }
    return 0;
}

 

posted @ 2012-12-07 22:36  _hikaru__  阅读(202)  评论(0编辑  收藏  举报