题解 | #最小生成树#

最小生成树

https://www.nowcoder.com/practice/735a34ff4672498b95660f43b7fcd628

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回最小的花费代价使得这n户人家连接起来
     * @param n int整型 n户人家的村庄
     * @param m int整型 m条路
    blank     * @param cost int整型二维数组 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价
     * @return int整型
     */
    //边的定义
    static class Edge {
        int src;
        int dest;
        int weight;

        public Edge(int src, int dest, int weight) {
            this.src = src;
            this.dest = dest;
            this.weight = weight;
        }
    }

    //prime算法实现
    public int miniSpanningTree(int n, int m, int[][] cost) {
        int[][] doubleCost = new int[2 * m][3];
        int i = 0;
        for (int[] c : cost) {
            doubleCost[i] = c;
            doubleCost[i + 1][0] = c[1];
            doubleCost[i + 1][1] = c[0];
            doubleCost[i + 1][2] = c[2];
            i += 2;
        }


        //贪心算法,局部最优
        //起始节点集合与目的节点集合
        Set<Integer> srcSet = new HashSet<>();
        //初始化两个集合
        srcSet.add(1);
        //从srcSet到destSet集合的边
        //定义优先级队列与初始优先级队列
        PriorityQueue<Edge> minHeap = new PriorityQueue<>(
            Comparator.comparingInt(a -> a.weight)
        );
        for (int[] c : doubleCost) {
            if (c[0] == 1) {
                minHeap.offer(new Edge(1, c[1], c[2]));
            }
        }
        int retWeight = 0;
        while (!minHeap.isEmpty()) {
            Edge minEdge = minHeap.poll();
            int dest = minEdge.dest;
            //判断dest是否被标记过
            if (!srcSet.contains(dest)) {
                retWeight += minEdge.weight;
                //目的节点被标记:加入srcSet
                srcSet.add(dest);
                //添加新增起始顶点的所有直接连通的边
                for (int[] c : doubleCost) {
                    if (c[0] == dest) {
                        minHeap.offer(new Edge(dest, c[1], c[2]));
                    }
                }
            }
        }
        return retWeight;
    }
}

全部评论
Prime算法实现
点赞 回复 分享
发布于 2024-05-04 20:48 河南

相关推荐

程序员小白条:现在这个简历很没竞争力,而且很多都不要28届的,基本就看运气了,如果没简历包装的话,就海投中小厂吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# AI面会问哪些问题? #
25023次浏览 493人参与
# 中国电信笔试 #
31125次浏览 283人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
14202次浏览 209人参与
# 你的实习产出是真实的还是包装的? #
18885次浏览 330人参与
# 如果秋招能重来,我会____ #
96712次浏览 500人参与
# 春招至今,你的战绩如何? #
60246次浏览 547人参与
# 厦门银行科技岗值不值得投 #
7520次浏览 186人参与
# i人适合做什么工作 #
36936次浏览 124人参与
# 我是面试官,请用一句话让我破防 #
79532次浏览 219人参与
# 哪些公司真双非友好? #
69228次浏览 287人参与
# 金三银四,你的春招进行到哪个阶段了? #
21575次浏览 277人参与
# 找AI工作可以去哪些公司? #
7754次浏览 189人参与
# 从事AI岗需要掌握哪些技术栈? #
7768次浏览 252人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
339975次浏览 2165人参与
# 面试尴尬现场 #
220783次浏览 861人参与
# 五一之后,实习真的很难找吗? #
102811次浏览 584人参与
# 你做过最难的笔试是哪家公司 #
30395次浏览 193人参与
# 你小时候最想从事什么职业 #
159845次浏览 2072人参与
# 应届生第一份工资要多少合适 #
20491次浏览 84人参与
# 阿里笔试 #
176558次浏览 1302人参与
# 一张图晒出你司的标语 #
3846次浏览 72人参与
# 面试被问期望薪资时该如何回答 #
382478次浏览 2163人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务