Union-Find with Weighted Union and find path compression
一个使用Union-Find的例子 使用Java语言描述
public class SocialNetwork{
public void main(String[] args){
}
public class UnionFind{
private int[] id;
private int[] sz;
private int nCount;
private boolean bAllConnected;
// we use the path compress
private int root(int i){
while(i != id[i]){
id[i] = id[id[i]];
i = id[i];
}
return i;
}
public UnionFind(int n){
nCount = n;
bAllConnected = false;
id = new int[n];
sz = new int[n];
for(int i = 0; i < n; i++){
id[i] = i;
sz[i] = 1;
}
}
public boolean connected(int p, int q){
return root(p) == root(q);
}
public boolean linkPair(int p, int q){
int rp = root(p);
int rq = root(q);
if(rp == rq) return bAllConnected ;
if(sz[rp] < sz[rq]){
sz[rq] += sz[rp];
id[rp] = rq;
if(sz[rq] == nCount)
bAllConnected = true;
}else{
sz[rp] += sz[rq];
id[rq] = rp;
if(sz[rp] == nCount)
bAllConnected = true;
}
return bAllConnected;
}
}
}
该算法基于Quick-Find 和Quick-Union改进
Find复杂度 | Union复杂度 | |
Quick-Find | 1 | N |
Quick-Union | N | N+ |
WQUPC | lgN | logN+ |