poj 2425

来源:互联网 发布:tcl电视网络接口在哪 编辑:程序博客网 时间:2024/05/16 07:59

题意是说在一个有n个点的图中有m个棋子,两个人可以轮流顺着边移动棋子,边是有向的,谁不能移动就算输了。

显然一题简单的组合博弈题,将每个棋子看做一个子游戏,求出其sg值,之后异或就知道先手能不能赢了,我采用的是邻接表+记忆化搜索sg值。

#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#include<string>using namespace std;struct nd{int num,next;}e[1000005];int head[1005],sg[1005];int mex(int n){if(sg[n]!=-1)return sg[n];bool vd[1005];memset(vd,0,sizeof(vd));for(int i=head[n];i>=0;i=e[i].next){sg[e[i].num]=mex(e[i].num);vd[sg[e[i].num]]=1;}for(int i=0;1;i++){if(!vd[i]){sg[n]=i;break;}}return sg[n];}int main(){int n,m,k,x,cn;while(scanf("%d",&n)!=EOF){k=0;memset(head,-1,sizeof(head));for(int i=0;i<n;i++){scanf("%d",&m);for(int j=0;j<m;j++){scanf("%d",&x);e[k].num=x;e[k].next=head[i];head[i]=k;k++;}}memset(sg,-1,sizeof(sg));while(1){int ans=0;scanf("%d",&cn);if(cn==0)break;for(int i=0;i<cn;i++){scanf("%d",&x);ans^=mex(x);}if(!ans)printf("LOSE\n");elseprintf("WIN\n");}}return 0;}


原创粉丝点击