一直不是很明白并查集路径压缩,总习惯一种写法
一般的循环查找跟:
int find (int x){
while (x != father[x]){
x = father[x];
}
return x;
}
递归查找:
int find (int x){
if(x == father[x]){
return x;
}
else{
return find( father[x]);
}
}
路径压缩的递归 :
int find(int x) { //查找x元素所在的集合,回溯时压缩路径
if (x != father[x]){
father[x] = find(father[x]); //回溯时的压缩路径
} //从x结点搜索到祖先结点所经过的结点都指向该祖先结点
return father[x];
}
路径压缩非递归:
int find(int x){
int k, j, r;
r = x;
while(r != father[r]) { //查找跟节点
r = father[r]; //找到跟节点,用r记录下
}
k = x;
while(k != r){ //非递归路径压缩操作
j = father[k]; //用j暂存parent[k]的父节点
father[k] = r; //parent[x]指向跟节点
k = j; //k移到父节点
}
return r; //返回根节点的值
}