本文章仅供作者复习代码,不提供教程(要说教程,小的真的不会啊),所以有小伙伴勿入请火速离开,以免寻砖砍死作者造成不必要的麻烦。
并查集的实现:
int par[MAX_N]; //父亲
int height[MAX_N];//树的高度
//初始化n个元素
void init(int n){
for(int i=0; i<n; i++){
par[i] = i; //将每个初始化的点的父亲设置为自己本身即代表该点为孤立的点
height[i] = 0;//初始化时,每个点的高度均为0
}
}
//查询树的根节点,并且在查询过程中,进行路径压缩
int find(int x){
if(par[x] == x){
return x;//如果x是孤立的点,那么它的根节点就是它本身
}else{
return par[x] = find(x); // 递归找x的根节点,找到之后,x的父节点直接设置为根节点
}
}
//合并两个节点
void unite(int x,int y){
x = find(x);
y = find(y);
if(x == y)return;//如果两点本来就连通,则返回。
if(height[x]<height[y]){
par[x] = y; //如果x的树的高度比y的小,则把x附在y上
}else{
par[y] = x;
if(height[x] == height[y])height[x]++; //如果两者高度相同的话,把么合并后,高度必增长1
}
}
//判断x,y是否属于同一集合
bool same(int x, int y){return find(x) == find(y);}