public class UF {
private int[] id;//分量id(以触点作为索引
private int count;//分量数量
public UF(int N){//初始化分量id数组
count=N;
id=new int[N];
for(int i=0;i<N;i++)
id[i]=i;
}
public int count(){
return count;
}
public boolean connected(int p,int q){
return find(p)==find(q);
}
/*
* quick-find
public int find(int p){
return id[p];
}
public void union(int p,int q){//将p和q归并到相同的分量中
int pID=find(p);
int qID=find(q);
//如果p q已经在相同分量之中就不需要采取任何行动
if(pID==qID) return;
//将p的分量重命名为q的名称
for(int i=0;i<id.length;i++)
if(id[i]==pID) id[i]=qID;
count--;
}
*/
/*
* quick_union
*/
private int find(int p){//找出分量的名称
while(p!=id[p]) p=id[p];
return p;
}
public void union(int p,int q){
//将p q的根节点统一
int pRoot=find(p);
int qRoot=find(q);
if(pRoot==qRoot) return;
id[pRoot]=qRoot;
count--;
}
public static void main(String[] args){
int N=10;
UF uf=new UF(N);
}
}
//加权quick-union
class WeightedQuickUnionUF{
private int[] id;
private int[] sz;
private int count;
public WeightedQuickUnionUF(int N) {
count=N;
id=new int[N];
for(int i=0;i<N;i++)
id[i]=i;
sz=new int[N];
for(int i=0;i<N;i++)
sz[i]=1;
}
public int count(){
return count;
}
public boolean connected(int p,int q){
return find(p)==find(q);
}
private int find(int p){
while(p!=id[p]) p=id[p];
return p;
}
public void union(int p,int q){
int i=find(p);
int j=find(q);
if(i==j) return;
//将小树的根节点连接到大树的根节点
if(sz[i]<sz[j]){
id[i]=j;sz[j]+=sz[i];
}else{
id[j]=i;sz[i]+=sz[j];
}
count--;
}
}