博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
并查集
阅读量:5091 次
发布时间:2019-06-13

本文共 1955 字,大约阅读时间需要 6 分钟。

 

package newcoder;import java.util.HashMap;import java.util.List;import java.util.Stack;public class UnionFind {    public static class Element
{ public V value; public Element (V value) { this.value = value; } } public static class UnionFindSet
{ /** * 根据用户的value映射为包装类 */ public HashMap
> elementMap; /** * 每个element都有自己的parent,代表节点的parent为自己 */ public HashMap
, Element
> parentMap; /** * 每个代表节点代表了多少节点(如果不是代表节点,则为0) */ public HashMap
, Integer> sizeMap; /** * 初始化操作 */ public UnionFindSet(List
list) { elementMap = new HashMap<>(); parentMap = new HashMap<>(); sizeMap = new HashMap<>(); for (V v : list) { Element
ele = new Element
(v); elementMap.put(v, ele); parentMap.put(ele, ele); sizeMap.put(ele, 1); } } /** * 方法1:判断两个节点是否为同一个集合 */ public boolean isSameSet(V a, V b) { if(elementMap.containsKey(a) && elementMap.containsKey(b)) { return findHead(elementMap.get(a)) == findHead(elementMap.get(b)); } return false; } /** * 方法2:合并两个元素 * @param a * @param b */ public void union(V a, V b) { if(elementMap.containsKey(a) && elementMap.containsKey(b)) { Element
aHead = findHead(elementMap.get(a)); Element
bHead = findHead(elementMap.get(b)); if(aHead != bHead) { Element
big = sizeMap.get(aHead) > sizeMap.get(bHead) ? aHead : bHead; Element
small = big == aHead ? bHead : aHead; parentMap.put(small, big); sizeMap.put(big, sizeMap.get(big) + sizeMap.get(small)); sizeMap.remove(small); } } } /** * 私有方法:获取代表节点并将节点扁平化 * @param ele * @return */ private Element
findHead(Element
ele) { Stack
> stack = new Stack<>(); while(ele != parentMap.get(ele)) { stack.push(ele); ele = parentMap.get(ele); } while(!stack.isEmpty()) { parentMap.put(stack.pop(), ele); } return ele; } } }

 

转载于:https://www.cnblogs.com/lovezmc/p/11447729.html

你可能感兴趣的文章
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>
mysql8.0.13下载与安装图文教程
查看>>
站立会议08(冲刺2)
查看>>
url查询参数解析
查看>>
http://coolshell.cn/articles/10910.html
查看>>
[转]jsbsim基础概念
查看>>
DIV和SPAN的区别
查看>>
第一次使用cnblogs
查看>>
C#语法糖之 session操作类 asp.net
查看>>
2015 Multi-University Training Contest 3
查看>>
使用Gitblit 在windows 上部署你的Git Server
查看>>
Thrift Expected protocol id ffffff82 but got 0
查看>>
【2.2】创建博客文章模型
查看>>
【3.1】Cookiecutter安装和使用
查看>>
【2.3】初始Django Shell
查看>>
Linux(Centos)之安装Redis及注意事项
查看>>
bzoj 1010: [HNOI2008]玩具装箱toy
查看>>
Kotlin动态图
查看>>
基元线程同步构造
查看>>