-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMinCostToConnectAllPoints.java
More file actions
109 lines (92 loc) · 2.69 KB
/
MinCostToConnectAllPoints.java
File metadata and controls
109 lines (92 loc) · 2.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/**
* You are given an array points representing integer coordinates of some points on a 2D-plane, where points[i] = [xi, yi].
*
* The cost of connecting two points [xi, yi] and [xj, yj] is the manhattan distance between them: |xi - xj| + |yi - yj|, where |val| denotes the absolute value of val.
*
* Return the minimum cost to make all points connected. All points are connected if there is exactly one simple path between any two points.
*
*
*
* Example 1:
*
*
* Input: points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
* Output: 20
* Explanation:
*
* We can connect the points as shown above to get the minimum cost of 20.
* Notice that there is a unique path between every pair of points.
* Example 2:
*
* Input: points = [[3,12],[-2,5],[-4,1]]
* Output: 18
*
*
* Constraints:
*
* 1 <= points.length <= 1000
* -106 <= xi, yi <= 106
* All pairs (xi, yi) are distinct.
*/
class Solution {
class Edge implements Comparable<Edge>{
int src;
int dest;
int dist;
Edge(int a, int b, int[][] points){
src = a;
dest = b;
dist = getDist(a, b, points);
}
@Override
public int compareTo(Edge a){
return dist < a.dist ? -1 : (dist == a.dist ? 0 : 1);
}
@Override
public String toString(){
return "{" + src + " " + dest + " " + dist + "}";
}
}
public int minCostConnectPoints(int[][] points) {
int n = points.length;
parent = new int[n];
List<Edge> edgeList = new ArrayList<Edge>();
for(int i = 0; i < n; i++){
parent[i] = i;
for(int j = 0; j < i; j++){
edgeList.add(new Edge(i, j, points));
}
}
Collections.sort(edgeList);
int ans = 0, cnt = 0;
for(int i = 0; i < edgeList.size() && cnt < n; i++){
int src = edgeList.get(i).src;
int dest = edgeList.get(i).dest;
if(!checkCircularTree(src, dest)){
ans += edgeList.get(i).dist;
}
}
return ans;
}
private int[] parent;
private boolean checkCircularTree(int st, int en){
int root1 = find(st);
int root2 = find(en);
if(root1 == root2) return true;
union(root1, root2);
return false;
}
public int find(int a){
if(parent[a] == a) return a;
return find(parent[a]);
}
public void union(int a, int b){
if(a > b) parent[b] = a;
else parent[a] = b;
}
private int getDist(int i, int j, int[][] points){
int[] a = points[i];
int[] b = points[j];
return Math.abs(a[0] - b[0]) + Math.abs(a[1] - b[1]);
}
}