//HDOJ 1524 A Chess Game SG函数
/*
题意:有一个有向无环图,在一些点有石子,这些石子每次可以往其后继结点移动。
两个人轮流移动,不能移动的为输
思路:建图,算出每个点的SG值
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1005
#define M 1000005
int n,m;
int num,head[N];
int in[N],out[N],sg[N];
struct node{
int from;
int to;
int next;
}edge[M];
void addedge(int from,int to){
edge[num].from = from;
edge[num].to = to;
edge[num].next = head[from];
head[from] = num++;
}
void init(){
num = 0;
memset(head,-1,sizeof(head));
memset(sg,-1,sizeof(sg));
}
int mex(int n){
int i;
bool vis[N];
if(sg[n] != -1)
return sg[n];
memset(vis,false,sizeof(vis));
for(i = head[n]; i != -1; i = edge[i].next){
if(sg[edge[i].to] == -1)
sg[edge[i].to] = mex(edge[i].to);
vis[sg[edge[i].to]] = true;
}
for(i = 0; ; ++i)
if(vis[i]==false)
return i;
}
int main(){
int i,j,k,x,a,p;
while(scanf("%d",&n)!=EOF){
init();
for(i = 0; i < n; ++i){
scanf("%d",&m);
for(j = 0; j < m; ++j){
scanf("%d",&k);
addedge(i,k);
}
}
while(scanf("%d",&x),x){
int ans = 0;
for(i = 0; i < x; ++i){
scanf("%d",&a);
ans ^= mex(a);
}
puts(ans?"WIN":"LOSE");
}
}
return 0;
}
分享到:
相关推荐
HDOJ题目分类HDOJ题目分类HDOJ题目分类
ACM ICPC HDOJ1002
ACM ICPC HDOJ1001
hdoj1001标程
hdoj上的资源,代码有注释,很不错的哦
hdoj1004,解题代码,答案代码,欢迎下载
ACM ICPC HDOJ1008
ACM ICPC HDOJ1003
杭州电子科技大学hdoj1002,大整数相加问题
杭州电子科大HDOJ
ACM ICPC HDOJ1000
hdoj解题代码,题目为1000-1050
c语言 最短路 是hdoj上的一个最短路问题,写的很牛
一些HDOJ上的DP题目的小总结,但愿能帮到那些想专攻DP的人吧
codj,hdoj的源码(50-60题)
hdoj 2013 多校训练3标程+解题报告
HDOJ 源代码 包含几百道HDOJ题目源码
hdoj1005 Number Sequence, 杭州电子科技大学oj题目代码
包括简单数学 组合数学 动态规划 贪心算法 母函数 搜索算法 组合博弈论 计算几何 等等
杭电OJ(1000-1099) AC 代码