poj1182(并查集)

把两个节点的关系转换为对根节点的关系的比较

View Code
 1 #include <stdio.h>
 2 int father[50001] ,r[50001];
 3 void init(int n)
 4 {
 5     int i;
 6     for(i = 1 ; i <= n ; i++)
 7     {
 8         father[i] = i;
 9         r[i] = 0;
10     }
11 }
12 int find(int x)
13 {
14     if(x == father[x])
15     return father[x];
16     else
17     {
18          int pre = father[x];
19         father[x] = find(father[x]);
20         r[x] = (r[x]+r[pre])%3;
21     }
22     return father[x];
23 }
24 void union1(int x, int y,int d)
25 {
26     father[x] = y;
27     r[x] = d%3;
28 }
29 int main()
30 {
31     int k,d, x, y, i, j,n,num = 0;
32     scanf("%d%d", &n,  &k);
33     init(n);
34     while(k--)
35     {
36         scanf("%d%d%d", &d,&x, &y);
37         if(x>n||y>n||(d == 2&&x == y))
38         num++;
39         else
40         {
41             int pa = find(x);
42             int pb = find(y);
43             if(pa == pb)
44             {
45                 if(d ==1)
46                 {
47                     if(r[x] != r[y])
48                     num++;
49                 }
50                 else
51                 {
52                     if(r[x]!=(r[y]+1)%3)
53                      num++;
54                 }
55             }
56             else
57             union1(pa,pb,r[y]-r[x]+d+2);
58         }
59     }
60     printf("%d\n",num);
61     return 0;
62 }
原文地址:https://www.cnblogs.com/shangyu/p/2578396.html