题解 | 最小生成树 Prim

最小生成树

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

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回最小的花费代价使得这n户人家连接起来
     * @param n int整型 n户人家的村庄
     * @param m int整型 m条路
     * @param cost int整型二维数组 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价
     * @return int整型
     */
    public int miniSpanningTree (int n, int m, int[][] cost) {
        // Prim算法
        int totalCost = 0;
        ArrayList<ArrayList<int[]>> list = new ArrayList(); //list.get(i).get(j)是一个从i出发的边
        for(int i = 0;i<=n;i++){
            list.add(new ArrayList());
        }

        for(int i = 0;i<m;i++){
            //System.out.println(cost[i][0]+" "+cost[i][1]+" "+cost[i][2]);
            list.get(cost[i][0]).add(new int[]{cost[i][1],cost[i][2]});
            list.get(cost[i][1]).add(new int[]{cost[i][0],cost[i][2]});
        }

        PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)->o1[1]-o2[1]);

        boolean[] isVisited = new boolean[n+1];

        pq.add(new int[]{1,0});


        while(!pq.isEmpty()){

            int[] curNode = pq.poll(); 

            int newNode = curNode[0];
            int newCost = curNode[1];
            if(isVisited[newNode]) continue;
            isVisited[newNode] = true;
            totalCost+=newCost;
            //更新堆
            for(int[] edge:list.get(newNode)){
                pq.add(edge);
            }
        }
        return totalCost;
    }
}

全部评论

相关推荐

等闲_:感觉有好多地方会被问穿,mysql存储向量这个方案问题应该很大的,如果深问的的话,为什么不用es,不用pg,不用mivus,分块策略是怎么做的,向量化是怎么向量化的,稠密向量还是稀疏向量,再深问余弦相似度,HSWM算法,Bm25算法,为什么不用混合检索或者Rank重排序优化?其他的项目不停机分库分表咋实现的,切库过程中数据有diff的话有没有补偿策略?既然有了分库分表了有没有碰到业务上不好优化的慢sql,让这个sql读从库?而且点评的话,最好自己压测过,要不这个数据也不好解释。现在就27的情况来看,很多同学已经有了中大厂实习,这个节点也会偏向这些有大厂实习的92同学,而且hc也不多,所以坚持海投吧
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务