poj2425--A Chess Game
Posted GFY
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2425--A Chess Game相关的知识,希望对你有一定的参考价值。
题意:给定一棵有向图的树,有些节点上有石子,每次可以取一个石子向一个有向边移动,不能移动者负。
Ans:树上nim,叶子节点nim为0,父亲节点递归儿子得到sg值,答案就是每个石子所在点的sg值异或和。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<string> 6 #include<algorithm> 7 int sg[1005],s[1005],n,x,ans,m; 8 int tot,go[1005*2005],first[1005],next[1005*2005],ru[1005],num; 9 void insert(int x,int y){ 10 tot++; 11 go[tot]=y; 12 next[tot]=first[x]; 13 first[x]=tot; 14 } 15 int dfs(int x){ 16 if (s[x]!=-1) return s[x]; 17 //if (first[x]==0) return s[x]=0; 18 int ss[1024]; 19 memset(ss,0,sizeof ss); 20 for (int i=first[x];i;i=next[i]){ 21 int pur=go[i]; 22 ss[dfs(pur)]=1; 23 } 24 for (int i=0;i<=n+1;i++) 25 if (ss[i]==0) return s[x]=i; 26 } 27 int main(){ 28 freopen("tx.in","r",stdin); 29 while (~scanf("%d",&n)){ 30 memset(s,-1,sizeof s); 31 memset(first,0,sizeof first); 32 memset(ru,0,sizeof ru); 33 tot=0; 34 for (int i=0;i<n;i++){ 35 scanf("%d",&num); 36 for (int j=1;j<=num;j++){ 37 scanf("%d",&x); 38 insert(i,x); 39 ru[x]++; 40 } 41 } 42 for (int i=0;i<n;i++) 43 if (ru[i]==0){ 44 s[i]=dfs(i); 45 } 46 while (scanf("%d",&m)&&m){ 47 ans=0; 48 for (int i=1;i<=m;i++){ 49 scanf("%d",&x); 50 ans^=s[x]; 51 } 52 if (ans) printf("WIN\n"); 53 else printf("LOSE\n"); 54 } 55 } 56 }
以上是关于poj2425--A Chess Game的主要内容,如果未能解决你的问题,请参考以下文章
POJ 2425 A Chess Game 博弈论 sg函数