POJ2425(树形,无向无环图博弈)
来源:互联网 发布:linux服务器系统命令 编辑:程序博客网 时间:2024/05/16 07:05
题目:题目链接
这道题目的意思是说两人挪棋子,棋子放在棋盘上,一个人挪动的时候可以移动到链接到的下一个点。当一个人不能挪动棋子的时候就输了。问先手是赢还是输?
如果光看一个石子的话,这就是sg函数的定义。然后对整个图处理一下每个点的sg值。对这M个点怎么处理,这么想吧。假设其中一个点为i,其sg值为sg[i] = a (a != 0)
那可以发现,i可以走向[0, a-1]的任意sg值,这相当与什么?相当与这里有一堆石子,共a个。M个点就是M堆石子,每堆石子的个数就是这个点的sg值。好吧Nim博弈出来了。
代码:
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <map>#include <vector>#include <cstdlib>#include <cmath>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>using namespace std;int mp[1001][1001];int SG[1001];int N;int DFS(int n){ int i; if(SG[n]!=-1) return SG[n]; bool next[1001]; memset(next, 0, sizeof(next)); for(i = 0; i < N; ++i) { if(mp[n][i] != -1) next[DFS(i)] = 1; } i = 0; while(next[i]) i++; return SG[i] = i;}int main(){ int i, j, k, t; int X; int tp, ans; while(scanf("%d", &N)!=EOF) { memset(mp, -1, sizeof(mp)); memset(SG, -1, sizeof(SG)); for(i = 0; i < N; ++i) { scanf("%d", &k); if(k==0) SG[i] = 0; for(j =0 ; j < k; ++j) { scanf("%d", &t); mp[i][t] = 1; } } while(scanf("%d", &X)) { if(X==0) break; ans = 0; for(i = 0; i < X; ++i) { scanf("%d", &tp); ans = ans ^ DFS(tp); } if(ans != 0) printf("WIN\n"); else printf("LOSE\n"); } } return 0;}
#include <iostream>#include <cstdio>#include <string>#include <string.h>#include <vector>#include <cstdlib>#include <cmath>#include <algorithm>#include <cmath>#include <queue>#include <set>#include <stack>using namespace std;int map[1010][1010];int SG[1010];int N;int DFS(int n){ int i; if(SG[n]!=-1) return SG[n]; bool used[1010]; memset(used,0,sizeof(used)); for(i=0; i<N; i++) { if(map[n][i] != -1) used[DFS(i)]=true; } i=0; while(used[i]) i++; return SG[n]=i;}int main(){ int i,j,k,t; int X; int tp,ans; while(scanf("%d",&N) != EOF) { memset(map,255,sizeof(map)); memset(SG,255,sizeof(SG)); for(i=0; i<N; i++) { scanf("%d",&k); if(k == 0) { SG[i] = 0; } for(j=0; j<k; j++) { scanf("%d",&t); map[i][t] = 1; } } while(scanf("%d",&X) != EOF) { if(X == 0) break; ans = 0; for(i=0; i<X; i++) { scanf("%d",&tp); ans = ans ^DFS(tp); } if(ans != 0) printf("WIN\n"); else printf("LOSE\n"); } } return 0;}
努力努力...
- POJ2425(树形,无向无环图博弈)
- POJ2425(树形,无向无环图博弈) SG函数
- poj2425(博弈SG函数)
- HDU3904【有向无环树形图SG博弈】
- [POJ2425]A Chess Game(博弈SG函数)
- 博弈-Green Hackenbush(无向图删边)
- POJ2425 A Chess Game(博弈)
- poj2425 博弈论 有向图
- poj 3710 Christmas Game(博弈 无向图删边游戏)
- poj2425
- 算法训练 结点选择 (无向边树形DP)
- 博弈-Green Hackenbush(无向图删边)
- 博弈-Green Hackenbush(无向图删边)
- 博弈-Green Hackenbush(无向图删边)
- 博弈-Green Hackenbush(无向图删边)
- 博弈-Green Hackenbush(无向图删边)
- 【POJ2425】A Chess Game 博弈,SG函数,裸题,模板题
- POJ 2425 A Chess Game(联合组合博弈+树 无向无环图 )
- WinCE在工业生产现场采集数据的应用
- 不用防火墙自动对付CC攻击防范vbs
- MYSQL SHOW VARIABLES简介
- 2011年新篇90后"所谓黑客"名单
- 如何合并两个vector?
- POJ2425(树形,无向无环图博弈)
- win7里边使用telnet命令为什么提示telnet不是内部或外部命令,也不是可运行的程序或批处理文件?
- 大学毕业后拉开差距的真正原因
- 排序算法之冒泡算法
- Java异常处理总结 异常 详解~~
- 双链表
- struts2漏洞原理及解决办法
- Myeclipse/Eclipse 中修改默认字符编码
- PDF 开源库libharu