
并查集
发布日期:2021-05-07 11:59:36
浏览次数:26
分类:原创文章
本文共 1587 字,大约阅读时间需要 5 分钟。
代码
public class UnionFind { public static class Node<V>{ V value; public Node(V v) { value = v; } } public static class UnionSet<V>{ public HashMap<V, Node<V>> nodes; public HashMap<Node<V>, Node<V>> parents; public HashMap<Node<V>, Integer> sizeMap; public UnionSet(List<V> values) { nodes = new HashMap<V,Node<V>>(); parents = new HashMap<Node<V>,Node<V>>(); sizeMap = new HashMap<Node<V>,Integer>(); for(V cur: values) { Node<V> node = new Node<>(cur); nodes.put(cur, node); parents.put(node,node); sizeMap.put(node, 1); } } //从点cur开始,一直往上找,找到再不能往上的代表点,返回 public Node<V> findFather(Node<V> cur){ Stack<Node<V>> path = new Stack<>(); while(cur != parents.get(cur)) { path.push(cur); cur = parents.get(cur); } //cur头结点 while(!path.isEmpty()) { parents.put(path.pop(),cur); } return cur; } public boolean isSameSet(V a,V b) { if(!nodes.containsKey(a) || !nodes.containsKey(b)) { return false; } return findFather(nodes.get(a)) == findFather(nodes.get(b)); } public void union(V a,V b) { if(!nodes.containsKey(a) || !nodes.containsKey(b)) { return; } Node<V> aHead = findFather(nodes.get(a)); Node<V> bHead = findFather(nodes.get(b)); if(aHead != bHead) { int aSetSize = sizeMap.get(aHead); int bSetSize = sizeMap.get(bHead); Node<V> big = aSetSize >= bSetSize ? aHead:bHead; Node<V> small = big == aHead ? bHead:aHead; parents.put(small,big); sizeMap.put(big, aSetSize + bSetSize); sizeMap.remove(small); } } }}
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年03月29日 04时43分45秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
(恋上数据结构笔记):优先级队列(Priority Queue)
2019-03-04
(Python学习笔记):字典
2019-03-04
(C++11/14/17学习笔记):并发基本概念及实现,进程、线程基本概念
2019-03-04
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
2019-03-04
(C++11/14/17学习笔记):创建多个线程、数据共享问题分析及案例
2019-03-04
(音视频学习笔记):SDL-YUV显示-播放音频PCM
2019-03-04
leetcode 14 最长公共前缀
2019-03-04
做做Java
2019-03-04
2020-2021新技术讲座课程
2019-03-04
shell中的数学运算
2019-03-04
如何使用4G模块通过MQTT协议传输温湿度数据到onenet
2019-03-04
map的find函数和count函数
2019-03-04
C++并发与多线程(一)
2019-03-04
C++ 并发与多线程(五)
2019-03-04
7628 EDCCA认证寄存器修改(认证自适应)
2019-03-04
C#四行代码写简易计算器,超详细带注释(建议新手看)
2019-03-04
计算机网络子网划分错题集
2019-03-04
java一些基本程序
2019-03-04
数据结构经典十套卷之八
2019-03-04
tensorflow入门变量常量
2019-03-04