解法一:Prime算法+堆
一个最小生成树问题。
import java.util.*;class Solution {public int minCostConnectPoints(int[][] points) {final int N = points.length;Point[] ps = new Point[N];for (int i = 0; i < N; ++i) {ps[i] = new Point(N);}for (int i = 0; i < N - 1; ++i) {for (int j = i + 1; j < N; ++j) {int dis = distance(points[i], points[j]);ps[i].nextList.add(new int[] { j, dis });ps[j].nextList.add(new int[] { i, dis });}}Comparator<int[]> comparator = new Comparator<int[]>() {@Overridepublic int compare(int[] o1, int[] o2) {return o1[1] - o2[1];}};Queue<int[]> queue = new PriorityQueue<>(comparator);ps[0].isVisited = true;queue.addAll(ps[0].nextList);int index = 1;int ans = 0;while (!queue.isEmpty() && index < N) {int[] min = queue.poll();if (ps[min[0]].isVisited) {continue;}ps[min[0]].isVisited = true;ans += min[1];++index;for (int[] pair : ps[min[0]].nextList) {if (!ps[pair[0]].isVisited) {queue.add(pair);}}}return ans;}private int distance(int[] p1, int[] p2) {return Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1]);}}class Point {boolean isVisited;List<int[]> nextList;public Point(int n) {this.isVisited = false;this.nextList = new ArrayList<>(n);}}
