并查集模板
来源:互联网 发布:ubuntu安装tar.gz软件 编辑:程序博客网 时间:2024/06/10 10:55
[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 }