并查集

并查集常用代码

 

 1 #include<stdio.h>

 2 #define MAX 11

 3 

 4 

 5 int father[MAX];   /* father[x]表示x的父节点*/

 6 int rank[MAX];     /* rank[x]表示x的秩*/

 7 

 8 

 9 /* 初始化集合*/

10 void Make_Set(int x)

11 {

12     father[x] = x; //根据实际情况指定的父节点可变化

13     rank[x] = 0;   //根据实际情况初始化秩也有所变化

14 }

15 

16 

17 

18 

19 //查找父节点

20 int find(int x)

21 {

22     return father[x] == x ? x : find(father[x]);

23 }

24 

25 //查找

26 int find1(int a)

27 {

28     int r=a;

29     while(f[r]!=r)  r=f[r];

30     return r;

31 }

32 

33 /* 查找x元素所在的集合,回溯时压缩路径*/

34 int Find_Set(int x)

35 {

36     if (x != father[x])

37     {

38         father[x] = Find_Set(father[x]); //这个回溯时的压缩路径是精华

39     }

40    return father[x];

41 }

42 

43 void find2(int a)

44 {

45     int i,j,r;

46     r=a;

47     while(f[r]!=r)

48         r=f[r];

49     i=a;

50     while(i!=r)

51     {

52         j=f[i];

53         f[i]=r;

54         i=j;

55     }

56 }

57 

58 

59 

60 

61 //创建并查集

62 void merge(int a,int b)

63 {

64     int A,B;

65     A=find(a);

66     B=find(b);

67     if(A!=B)

68         father[B]=A;

69 }

70 

71 void Union(int x, int y)

72 {

73     x = Find_Set(x);

74     y = Find_Set(y);

75     if (x == y) return;

76     if (rank[x] > rank[y]) 

77     {

78         father[y] = x;

79     }

80     else

81     {

82         if (rank[x] == rank[y])

83         {

84             rank[y]++;

85         }

86         father[x] = y;

87     }

88 }

 

//查找并压缩的非递归实现

int find1(int a)

{

    int i,j,r;

    r=a;

    while(f[r]!=r)

        r=f[r];

    i=a;

    while(i!=r)

    {

        j=f[i];

        f[i]=r;

        i=j;

    }

    return r;

}

//查找并压缩的非递归实现

int find(int x)

{

    if(x!=f[x])

        f[x]=find(f[x]);

    return f[x];

}

 

 

你可能感兴趣的:(并查集)