Prim算法之最小生成树

P算法思路: 给定任意一个节点,保证权值最小的情况下生成最小生成树,在确定一个节点后,在该节点的所有边中找到权值最小的,结果集加入这条边,然后使用这条边的to节点在解锁一些边,找出最小权值的边 ... 

对于解锁出的边存入小根堆中每次弹出最小权值的即为有效边

    /**
     * 最小生成树(保持树的连通性,保证权值最小)
     *
     * P算法:
     *      首先需要指定一个节点,由一个点解锁一批边,挑出最小的,也是用优先队列
     */
    public static HashSet<Edge> prim(Graph graph){
        PriorityQueue<Edge> priorityQueue = new PriorityQueue<>(new EdgeComparator());
        HashSet<Node> set = new HashSet<>();
        HashSet<Edge> result = new HashSet<>();
        for (Node value : graph.nodes.values()) {

            set.add(value);
            priorityQueue.addAll(value.edges);

            while (!priorityQueue.isEmpty()){
                Edge cur = priorityQueue.poll();
                Node to = cur.to;
                if(!set.contains(to)){
                    set.add(to);
                    result.add(cur);
                    for (Edge next : to.edges) {
                        if(!result.contains(next)){
                            priorityQueue.add(next);
                        }
                    }
                }
            }

            break;
        }
        return result;
    }

    private static class EdgeComparator implements Comparator<Edge>{

        @Override
        public int compare(Edge o1, Edge o2) {
            return o1.weight - o2.weight;
        }
    }

 左神算法学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值