解法一:Prime算法+堆

一个最小生成树问题。

  1. import java.util.*;
  2. class Solution {
  3. public int minCostConnectPoints(int[][] points) {
  4. final int N = points.length;
  5. Point[] ps = new Point[N];
  6. for (int i = 0; i < N; ++i) {
  7. ps[i] = new Point(N);
  8. }
  9. for (int i = 0; i < N - 1; ++i) {
  10. for (int j = i + 1; j < N; ++j) {
  11. int dis = distance(points[i], points[j]);
  12. ps[i].nextList.add(new int[] { j, dis });
  13. ps[j].nextList.add(new int[] { i, dis });
  14. }
  15. }
  16. Comparator<int[]> comparator = new Comparator<int[]>() {
  17. @Override
  18. public int compare(int[] o1, int[] o2) {
  19. return o1[1] - o2[1];
  20. }
  21. };
  22. Queue<int[]> queue = new PriorityQueue<>(comparator);
  23. ps[0].isVisited = true;
  24. queue.addAll(ps[0].nextList);
  25. int index = 1;
  26. int ans = 0;
  27. while (!queue.isEmpty() && index < N) {
  28. int[] min = queue.poll();
  29. if (ps[min[0]].isVisited) {
  30. continue;
  31. }
  32. ps[min[0]].isVisited = true;
  33. ans += min[1];
  34. ++index;
  35. for (int[] pair : ps[min[0]].nextList) {
  36. if (!ps[pair[0]].isVisited) {
  37. queue.add(pair);
  38. }
  39. }
  40. }
  41. return ans;
  42. }
  43. private int distance(int[] p1, int[] p2) {
  44. return Math.abs(p1[0] - p2[0]) + Math.abs(p1[1] - p2[1]);
  45. }
  46. }
  47. class Point {
  48. boolean isVisited;
  49. List<int[]> nextList;
  50. public Point(int n) {
  51. this.isVisited = false;
  52. this.nextList = new ArrayList<>(n);
  53. }
  54. }