HDU 1524 A Chess Game (有向无环图SG博弈)
转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents by---cxlove这是一个针对有向无环图的博弈。
题目:有N个位置,其中存在拓扑关系,移动时必须遵守。最后移动者胜,问是否有必胜策略
http://acm.hdu.edu.cn/showproblem.php?pid=1524
拓扑关系,说明是一个有向无环图。那么对于某个点的SG函数,便是他的后继结点中没有出现的最小的。(MEX操作),完全就是名字悬乎一点
和求普通的SG函数一样。
[cpp]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#define N 10005
#define LL long long
#define inf 1<<29
#define eps 1e-7
using namespace std;
vector<int>v[1005];
int n,sg[1005];
int get_sg(int n){
if(sg[n]!=-1)
return sg[n];
if(v[n].size()==0)
return 0;
int vis[1005];
memset(vis,0,sizeof(vis));
for(int i=0;i<v[n].size();i++){
sg[v[n][i]]=get_sg(v[n][i]);
vis[sg[v[n][i]]]=1;
}
for(int i=0;;i++)
if(vis[i]==0)
return i;
}
int main(){
while(scanf("%d",&n)!=EOF){
memset(sg,-1,sizeof(sg));
for(int i=0;i<n;i++){
v[i].clear();
int k,u;
scanf("%d",&k);
while(k--){
scanf("%d",&u);
v[i].push_back(u);
}
}
int q,k,u;
while(scanf("%d",&k)&&k){
int ret=0;
while(k--){
scanf("%d",&u);
if(sg[u]==-1)
sg[u]=get_sg(u);
ret^=sg[u];
}
if(ret==0)
puts("LOSE");
else
puts("WIN");
}
}
return 0;
}
作者:ACM_cxlove
补充:软件开发 , C++ ,