disjsets java_不相交集类(并查集)

并查集 就是只有合并和 查找操作的一种数据结构  很简单,主要判断一个元素是否在一个集合里 主要应用在最小生成树(Kruskal算法),看到图的时候会将实现代码贴上 package chapter8;

/**

* 类名:DisjSets 说明:实现并查集 按高度求并,路径压缩 s[i]代表i的父节点

*/

public class DisjSets {

public DisjSets(int numElements) {

s = new int[numElements];

for (int i = 0; i < numElements; i++)

s[i] = -1;

}

/**

* 方法名:union1 说明:将root2的父节点指为root1

*/

public void union1(int root1, int root2) {

s[root1] = root2;

}

/**

* 方法名:union2 说明:按高度求并

*/

public void union2(int root1, int root2) {

root1 = find(root1);

root2 = find(root2);

if(root1 == root2)

return;

else{

//root1的高度大于 root2的 则将root2成为root1的子树

if(s[root1] > s[root2])

s[root2] = root1;

else{

if(s[root1] == s[root2])

s[root2]++;

s[root1] = root2;

}

}

}

/**

* 方法名:union3 说明:按树的大小来合并,每个根的数组元素就是它包含树的大小的负值

*/

public void union3(int root1, int root2) {

root1 = find(root1);

root2 = find(root2);

if (root1 == root2)

return;

else {

// s[root1]< s[root2]说明 root1树大 将root2成为它的子树

if (s[root1] < s[root2]) {

s[root2] = root1;

s[root1] += s[root2];//更新根节点

} else

s[root1] = root2;

s[root2] += s[root1] + s[root2];

}

}

/**

* 方法名:find 说明:实现路径压缩 只是加了简单的一步 将s[x]指向不断递归所得到的根

*/

public int find(int x) {

if (s[x] < 0)

return x;

else

return s[x] = find(s[x]);

}

private int[] s;

public static void main(String[] args) {

// TODO Auto-generated method stub

}

}

原文:http://blog.csdn.net/xiuweikang/article/details/40987931

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值