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 }

 

你可能感兴趣的:(poj)