并查集模板

来源:互联网 发布: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 }