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; } }