1 返回根结点
//findFather函数返回元素x所在集合的根结点
int findFather(int x){
while(x!=father[x]){ //如果不是根结点,继续循环
x=father[x]; //获得自己的父亲结点
}
return x;
}
2 合并两个集合
//合并两个集合
void Union(int a,int b){
int faA=findFather(a); //查找a的根结点
int faB=findFather(b); //查找b的根结点
if(faA!=faB) //如果不属于同一个集合
father[faA]=faB; //则合并
}
3 路径压缩
//并查集路径压缩
int compression(int x){
int a=x;
while(x!=father[x])
x=father[x];
while(a!=father[a]){
int z=a; //先保存a的值,以修改father[a]
a=father[a]; //a回溯父亲结点
father[z]=x; //将原先的结点a的父亲改为根结点
}
return x;
}
//路径压缩递归写法
int compression2(int v){
if(v==father[v]) return v; //找到根结点
else{
int f=compression2(father[v]); //找到v的根结点f
father[v]=f; //将根结点f赋给father[v]
return f; //返回根结点
}
}