并查集java

48 篇文章 0 订阅
46 篇文章 0 订阅
public class Code04_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;
        public HashMap<Element<V>,Element<V>> fatherMap;
        public HashMap<Element<V>,Integer> rankMap;

        public UnionFindSet(List<V> lists) {
            elementMap = new HashMap<>();
            fatherMap = new HashMap<>();
            rankMap = new HashMap<>();
            for (V v : lists) {
                Element<V> element = new Element<>(v);
                elementMap.put(v, element);
                fatherMap.put(element, element);
                rankMap.put(element,1);
            }
        }

        public Element<V> findHead(Element<V> element){
            Stack<Element<V>> stack = new Stack<>();
            while (element != fatherMap.get(element)){
                stack.push(element);
                element = fatherMap.get(element);
            }

            while (!stack.isEmpty()){
                fatherMap.put(stack.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> aH = findHead(elementMap.get(a));
                Element<V> bH = findHead(elementMap.get(b));
                if (aH != bH){
                    Element<V> big = rankMap.get(aH) >= rankMap.get(bH) ? aH : bH;
                    Element<V> small = big == aH ? bH : aH;
                    fatherMap.put(small,big);
                    rankMap.put(big, rankMap.get(aH) + rankMap.get(bH));
                    rankMap.remove(small);
                }
            }
        }
    }

    public static void main(String[] args) {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值