1584. Min Cost to Connect All Points
Description
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.
Solution
min-cost-to-connect-all-points.py
class UnionFind:
def __init__(self):
self._parent = {}
self._size = {}
def union(self, a, b):
a, b = self.find(a), self.find(b)
if a == b:
return
if self._size[a] < self._size[b]:
a, b = b, a
self._parent[b] = a
self._size[a] += self._size[b]
def find(self, x):
if x not in self._parent:
self._parent[x] = x
self._size[x] = 1
while self._parent[x] != x:
self._parent[x] = self._parent[self._parent[x]]
x = self._parent[x]
return x
class Solution:
def minCostConnectPoints(self, points: List[List[int]]) -> int:
graph = []
n = len(points)
for i in range(n):
a, b = points[i]
for j in range(i + 1, n):
c, d = points[j]
dist = abs(a - c) + abs(b - d)
graph.append((dist, i, j))
res = 0
uf = UnionFind()
for dist, i, j in sorted(graph):
if uf.find(i) != uf.find(j):
uf.union(i, j)
res += dist
return res