查找父亲节点(并压缩路径)
//查找父亲节点,把当前查询节点的路径上的所有节点的父亲都指向根节点
// (降低查找父亲节点的时间复杂度)
int findFather(int x){
//由于x在下面的while中会变成根节点,因此先把原先的x保存一下
int a = x;
while(x != father[x]){
x = father[x];
}
//到这里,x存放的是根节点。下面把路径上的所有节点的father都改成根节点
while(a != father[a]){
int z =a; //因为a要被father[a]覆盖,所以先保存a的值,以修改father[a]
a = father[a];
father[z] = x; //将原先的节点a的父亲改为根节点x
}
return x; //返回根节点
}
合并两个集合:
int findFather(int x){
while(x != father[x]){
x = father[x];
}
return x; //返回根节点
}
//合并两个集合
void Union(int a,int b){
int faA = findFather(a);
int faB = findFather(b);
if(faA != faB){
father[faA] = faB;
}
}