介绍并查集文章 https://blog.csdn.net/zjy_code/article/details/80634149

public class UnionFind {public static class Element<V> {public V value;public Element(V value) {this.value = value;}}public static class UnionFindSet<V> {public HashMap<V, Element<V>> elementMap;// key 某个元素 value 该元素的父public HashMap<Element<V>, Element<V>> fatherMap;// key 某个集合的代表元素 value 该集合的大小public HashMap<Element<V>, Integer> rankMap;public UnionFindSet(List<V> list) {elementMap = new HashMap<>();fatherMap = new HashMap<>();rankMap = new HashMap<>();for (V value : list) {Element<V> element = new Element<V>(value);elementMap.put(value, element);fatherMap.put(element, element);rankMap.put(element, 1);}}private Element<V> findHead(Element<V> element) {Stack<Element<V>> path = new Stack<>();while (element != fatherMap.get(element)) {path.push(element);element = fatherMap.get(element);}while (!path.isEmpty()) {fatherMap.put(path.pop(), element);}return element;}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;}public void union(V a, V b) {if (elementMap.containsKey(a) && elementMap.containsKey(b)) {Element<V> aF = findHead(elementMap.get(a));Element<V> bF = findHead(elementMap.get(b));if (aF != bF) {Element<V> big = rankMap.get(aF) >= rankMap.get(bF) ? aF : bF;Element<V> small = big == aF ? bF : aF;fatherMap.put(small, big);rankMap.put(big, rankMap.get(aF) + rankMap.get(bF));rankMap.remove(small);}}}}}
