Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b95350d

Browse files
committed
1584. Min Cost to connect all points in Java
1 parent 52bdc09 commit b95350d

File tree

1 file changed

+129
-0
lines changed

1 file changed

+129
-0
lines changed
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
class Edge {
2+
public int source;
3+
public int destination;
4+
public int weight; // manhattan distance
5+
6+
public Edge(int s, int d, int w){
7+
this.source = s;
8+
this.destination = d;
9+
this.weight = w;
10+
}
11+
12+
@Override
13+
public String toString() {
14+
return "Edge(u=" + source + ", v=" + destination + ", w=" + weight + ")";
15+
}
16+
}
17+
18+
class DisjointSet {
19+
private int[] roots;
20+
private int[] ranks;
21+
22+
public DisjointSet(int n) {
23+
this.roots = new int[n];
24+
this.ranks = new int[n];
25+
26+
// intializing
27+
for(int i=0; i<n; i++){
28+
this.roots[i] = i;
29+
this.ranks[i] = 0; // initially ranking 0
30+
}
31+
}
32+
33+
// get the root, use path compression
34+
public int find(int u) {
35+
if(this.roots[u] == u)
36+
return u;
37+
38+
int root = find(this.roots[u]);
39+
this.roots[u] = root;
40+
return root;
41+
}
42+
43+
// use ranking
44+
public void union(int x, int y) {
45+
int rootX = find(x), rootY = find(y);
46+
int rankX = this.ranks[rootX], rankY = this.ranks[rootY];
47+
48+
if(rootX == rootY) // already same roots
49+
return;
50+
51+
if(rankX < rankY){
52+
// put into rootY
53+
this.roots[rootX] = this.roots[rootY];
54+
this.ranks[rootY]++;
55+
}
56+
else{
57+
// default, put into rootX
58+
this.roots[rootY] = this.roots[rootX];
59+
this.ranks[rootX]++;
60+
}
61+
}
62+
63+
public boolean areDisjoint(int u, int v) {
64+
return (find(u) != find(v));
65+
}
66+
}
67+
68+
class Solution {
69+
private int getManhattanDistance(int[] p1, int[] p2){
70+
return (
71+
Math.abs(p1[0] - p2[0]) +
72+
Math.abs(p1[1] - p2[1])
73+
);
74+
}
75+
76+
private List<Edge> getEdges(int[][] points) {
77+
int n = points.length;
78+
List<Edge> edges = new ArrayList<>();
79+
80+
// edge case
81+
if(n <= 1)
82+
return edges;
83+
84+
for(int i=0; i<(n - 1); i++){
85+
for(int j=i+1; j<n; j++){
86+
int w = getManhattanDistance(points[i], points[j]);
87+
edges.add(new Edge(i, j, w));
88+
}
89+
}
90+
91+
return edges;
92+
}
93+
94+
private boolean isEdgeCase(int[][] points) {
95+
return (points.length <= 1);
96+
}
97+
98+
private int getCostMST(List<Edge> edges, int numVertices) {
99+
DisjointSet ds = new DisjointSet(numVertices);
100+
int minCost = 0, numEdgesTaken = 0;
101+
102+
for(Edge edge: edges){
103+
if(ds.areDisjoint(edge.source, edge.destination)){
104+
ds.union(edge.source, edge.destination);
105+
numEdgesTaken++;
106+
minCost += edge.weight;
107+
}
108+
109+
if(numEdgesTaken == (numVertices - 1)) // tree is formed, early exit
110+
break;
111+
}
112+
return minCost;
113+
}
114+
115+
public int minCostConnectPoints(int[][] points) {
116+
// edge cases
117+
if(isEdgeCase(points))
118+
return 0;
119+
120+
// edges
121+
List<Edge> edges = getEdges(points);
122+
123+
// sort the edges in ascending order
124+
edges.sort((x1, x2) -> (x1.weight - x2.weight));
125+
126+
// Kruskals algorithm for MST [Union Find]
127+
return getCostMST(edges, points.length);
128+
}
129+
}

0 commit comments

Comments
 (0)