使用上一篇的使用来实现union-find算法,即用一个辅助数组来记录分量的权,每次都让权小的分量合并到权大的分量上,这样可以有效的保障算法再任何情况下的执行效率,每次union()都把分量小的合并到分量大的分量上。这样我们构造出来的树结构的层数就会减小。
代码实现:
public class UF(){
private int[] a;
private int[] sz;
private int count;
//初始化,sz存储分量的权,刚开始每个分量只有一个触点,所有sz[i]=1
public UF(int cap){
count = cap;
a = new int[cap];
sz = new int[cap];
for(int i=0;i<cap;i++){
a[i] = i;
sz[i]=1;
}
}
//找到分量的标记
public int find(int p){
while(p!=a[p]) p = a[p];
return p;
}
//连接两个触点,每次遍历权小的分量
public void union(int p,int q){
int rootP = find(p);
int rootQ = find(q);
if(sz(rootP)<sz(rootQ)){
a[rootP] = rootQ;
sz[rootQ]+=sz[rootP];
}else{
a[rootQ]=rootP;
sz[rootP]+=sz[rootQ];
}
count--;
}
//测试触点是否已连接
public boolean connected(int p,int q){
return find(p)==find(q);
}
//返回分量的数量
public int count(){
return count;
}
}