def min_cost_connect_points(points: List[List[int]]) -> int:
class DSU:
def __init__(self):
self.parent = {}
self.rank = {}
def find(self, node):
if node not in self.parent:
self.parent[node] = node
self.rank[node] = 1
if self.parent[node] != node:
self.parent[node] = self.find(self.parent[node])
return self.parent[node]
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if x == y:
return False
if self.rank[x] < self.rank[y]:
x, y = y, x
self.parent[y] = x
if self.rank[x] == self.rank[y]:
self.rank[x] += 1
return True
def manhattan_distance(p, q):
return abs(p[0] - q[0]) + abs(p[1] - q[1])
dsu = DSU()
edge_list = []
for i in range(len(points)):
dsu.find(i)
for j in range(0, i):
edge_list.append((i, j, manhattan_distance(points[i], points[j])))
edge_list.sort(key=lambda r: r[2])
min_cost = 0
for i, j, d in edge_list:
if dsu.find(i) != dsu.find(j):
min_cost += d
dsu.union(i, j)
return min_cost