#include <stdio.h>
const int MAX_N = 8;
int par[MAX_N]; //父亲
int rank[MAX_N];//树的高度
//初始化n个元素
void init(int n){
for(int i = 0;i < n;i ++) {
par[i] = i;
rank[i] = 0;
}
}
//查询树的根
int find(int x){
if(par[x] == x) {
return x;
} else { //递归找到树的根
return par[x] = find(par[x]);
}
}
//合并x和y所属的集合
void unite(int x, int y){
x = find(x);
y = find(y);
if(x == y) return ;
if(rank[x] < rank[y]){
par[x] = y;
} else {
par[y] = x;
if(rank[x] == rank[y]) rank[x] ++;
}
}
//判断x和y是否属于同一个集合
bool same(int x,int y){
return find(x) == find(y);
}
int main() {
int n = 7;
init(n);
printf("par:");
for(int i = 0;i < n;i ++) {
printf("%d ", par[i]);
}
printf("\n");
unite(1, 3);
unite(2, 4);
unite(1, 2);
unite(5, 6);
unite(6, 1);
printf("ran:");
for(int i = 0;i < n;i ++) {
printf("%d ", rank[i]);
}
printf("\n");
printf("par:");
for(int i = 0;i < n;i ++) {
printf("%d ", par[i]);
}
printf("\n");
return 0;
}
并查集模板
最新推荐文章于 2022-10-10 14:42:24 发布