解法一: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[]>() {
@Override
public 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);
}
}