Problem Link

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