union_find


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--;

}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值