码迷,mamicode.com
首页 > 其他好文 > 详细

【百题留念】hdoj 1524 A Chess Game(dfs + SG函数应用)

时间:2015-08-10 21:45:40      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1524

 1 #include<stdio.h>
 2 #include<cstring>
 3 using namespace std;
 4 const int M = 10000000;//
 5 const int N = 1005;
 6 int sg[N], head[N];
 7 int cnt;
 8 
 9 struct node{
10     int from;
11     int to;
12     int next;
13 }edge[M];
14 
15 void addedge( int from, int to){
16     edge[cnt].from = from;
17     edge[cnt].to = to;
18     edge[cnt].next = head[from];//同一个父节点引出的边
19     head[from] = cnt++;
20 }
21 
22 void init(){
23     cnt = 0;//总边数
24     memset(head,-1,sizeof(head));
25     memset(sg,-1,sizeof(sg));
26 }
27 
28 int mex(int n){
29     bool g[N];
30     memset(g,false,sizeof(g));
31     if( sg[n] != -1 )
32         return sg[n];
33     for(int i = head[n];i != -1; i = edge[i].next){
34         if( sg[edge[i].to] == -1 )
35             sg[edge[i].to] = mex(edge[i].to);
36         g[sg[edge[i].to]] = true;
37     }
38     for( int i = 0; i < N; ++i)
39         if(!g[i])
40             return i;
41 }
42 
43 int main(){
44     int n, m, tmp;
45     while(~scanf("%d",&n)){
46         init();
47         for(int i = 0; i < n; ++i){
48             scanf("%d",&m);
49             for( int j = 0; j < m; ++j){
50                 scanf("%d",&tmp);
51                 addedge(i,tmp);//建图
52             }
53         }
54         while(~scanf("%d",&m)&&m){
55             int ans = 0;
56             for( int i = 0; i < m; ++i){
57                 scanf("%d",&tmp);
58                 ans = ans ^ mex(tmp);
59             }
60             puts(ans?"WIN":"LOSE");
61         }
62     }
63     return 0;
64 }

 

百题留念        技术分享

【百题留念】hdoj 1524 A Chess Game(dfs + SG函数应用)

标签:

原文地址:http://www.cnblogs.com/blueprintf/p/4719046.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!