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
Python3
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:
N = len(points)
uf = UnionFind()
pq = []
res = 0
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)
heappush(pq, (dist, i, j))
count = 0
while count < N - 1:
dist, i, j = heappop(pq)
if uf.find(i) != uf.find(j):
count += 1
uf.union(i, j)
res += dist
return res