[cpp] view plaincopyprint?
1、make_set(x) 把每一个元素初始化为一个集合
建立一个新的集合,其中集合只有唯一的一个元素x
2、union_set(x, y) 按秩合并x,y所在的集合
3、find_set(x)返回x所在的集合的代表
在执行查找操作时,要沿着父节点指针一直找下去,直到找到树根为止。大家要注意途中的箭头。
4、实现并查集的标准代码:
1 #include <stdio.h>
2
3 const int MAXN = 100; /*结点数目上线*/
4 int pa[MAXN]; /*p[x]表示x的父节点*/
5 int rank[MAXN]; /*rank[x]是x的高度的一个上界*/
6
7 void make_set(int x)
8 {/*创建一个单元集*/
9 pa[x] = x;
10 rank[x] = 0;
11 }
12
13 int find_set(int x)
14 {/*带路径压缩的查找*/
15 if(x != pa[x])
16 pa[x] = find_set(p[x]);
17 return pa[x];
18 }
19
20 /*按秩合并x,y所在的集合*/
21 void union_set(int x, int y)
22 {
23 x = find_set(x);
24 y = find_set(y);
25 if(rank[x] > rank[y])/*让rank比较高的作为父结点*/
26 pa[y] = x;
27 else
28 {
29 pa[x] = y;
30 if(rank[x] == rank[y])
31 rank[y]++;
32 }
33 }
并查集模板
最新推荐文章于 2022-04-25 14:38:10 发布