并查集

并查集常用代码

 

 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];
}

 

原文地址:https://www.cnblogs.com/xiaofanke/p/2774109.html