1 #include <stdio.h>
2 #include <string.h>
3 #define MAX 1000
4
5 int p[MAX];
6 int rank[MAX];
7 void init(int n){
8 int i;
9 // memset(rank, 0, sizeof(rank));
10 for(i=1;i<n;i++) {p[i]=i;rank[i]=0;}
11 }
12
13
14 int find_root_digui(int x){
15 if(x!=p[x])
16 return p[x]=find_root(p[x]);
17 else return x;
18 }
19
20 int find_root(int x){
21
22 int i=x;
23 while(i!=p[i])
24 i=p[i];
25 int rot=i;
26 int temp;
27 i=x;
28 while (i!=p[i]){
29 temp=i;
30 i=p[i];
31 p[temp]=rot;
32 }
33 return rot;
34 }
35
36 int conn(int x,int y){
37 x=find_root(x);
38 y=find_root(y);
39 return x==y;
40 }
41
42 void _union(int x,int y){
43 x=find_root(x);
44 y=find_root(y);
45
46 if(rank[x]>=rank[y])
47 p[y]=x;
48 else p[x]=y;
49
50 if(rank[x]==rank[y]) rank[x]++;
51 }
52
53 void try()
54 {
55 _union(1,2);
56 _union(3,4);
57 _union(2,4);
58 _union(5,6);
59 _union(7,8);
60 _union(6,8);
61 _union(2,6);
62 int root = find_root(8);
63 printf("root = %d\n", root);
64
65 for(int i=1; i<10; i++)
66 {
67 printf("p[%d]=%d, rank[%d]=%d\n", i, p[i], i, rank[i]);
68 }
69
70 while(1)
71 {
72 int a, b;
73 scanf("%d%d", &a, &b);
74 printf("%d\n", conn(a,b));
75 printf("%d\n",rank[1]);
76 printf("%d\n",find_root(1));
77 }
78
79 }
80
81 int main(){
82 int n=20;
83 init(n);
84 try();
85 return 0;
86 }