poj 1733-Parity game解题报告

链接:http://poj.org/problem?id=1733

hash+并查集,和食物链那道题比较相似的确定关系的方法,[a,b]之间的1的个数可以通过[0,a-1],[0,b]来确定,所以,node[i].w存的是[0,w]的情况,因为区间比较大,而且问题的个数很少,所以用hash散射在一个数组上,这几道并查集的题都有些似懂非懂,看来这些好多东西弄到一块的题自己还是做的太少啊

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<stdlib.h>
 4 #define N 50005
 5 int hash[N];
 6 int a[N],b[N],c[N];
 7 int temp[2*N];
 8 struct NODE
 9 {
10     int f,w;
11     NODE()
12     {
13         f=-1;
14         w=0;
15     }
16 };
17 int cmp(const void *a,const void *b)
18 {
19     return *(int *)a-*(int *)b;
20 }
21 NODE node[N];
22 int k;
23 void init()
24 {
25     int i;
26     for(i=0;i<N;i++)
27     node[i]=NODE();
28 }
29 int myfind(int x)
30 {
31     if(node[x].f==-1)
32     return x;
33     int f;
34     f=myfind(node[x].f);
35     node[x].w+=node[node[x].f].w;
36     node[x].w%=2;
37     node[x].f=f;
38     return node[x].f;
39 }
40 void join(int x,int y,int z)
41 {
42     int sx=myfind(x);
43     int sy=myfind(y);
44     node[sy].f=sx;
45     node[sy].w=(z+node[x].w-node[y].w+2)%2;
46 }
47 void myhash()
48 {
49     int cnt=0,i;
50     qsort(temp,2*k,sizeof(int),cmp);
51     hash[temp[0]]=cnt++;
52     for(i=1;i<2*k;i++)
53     if(temp[i]!=temp[i-1])
54     hash[temp[i]]=cnt++;
55 }
56 int main()
57 {
58     int n;
59     scanf("%d%d",&n,&k);
60     int i,j=0;
61     char str[2][10]={"odd","even"};
62     char s[10];
63     init();
64     for(i=0;i<k;i++)
65     {
66         scanf("%d%d%s",&a[i],&b[i],s);
67         a[i]--;
68         temp[j++]=a[i];
69         temp[j++]=b[i];
70         if(strcmp(s,str[0]))
71         c[i]=1;
72         else
73         c[i]=0;
74     }
75     if(k)
76     myhash();
77     for(i=0;i<k;i++)
78     {
79         a[i]=hash[a[i]];
80         b[i]=hash[b[i]];
81         int sa=myfind(a[i]);
82         int sb=myfind(b[i]);
83         if(sa!=sb)
84         join(a[i],b[i],c[i]);
85         else
86         {
87             if((node[a[i]].w-node[b[i]].w+2)%2!=c[i])
88             break;
89         }
90     }
91     printf("%d\n",i);
92     return 0;
93 }

 

posted @ 2012-05-10 00:30  zhenhai  阅读(248)  评论(0编辑  收藏  举报