1. 解题思路
这一题思路上就是一个DSU的思路,我们首先将所有的边按照权重进行顺序排列,然后从小到大依次进行连接,直至图上的连通区域总数小于k个,此时上一轮我们连通的边就是可以取用的最小的边。
而关于DSU的方法实现,网上实在太多了,我自己也有一篇小博客《经典算法:并查集(DSU)结构简介》作为备忘,这里就不具体展开了,有兴趣的读者自己查阅一下就行了。
2. 代码实现
给出python代码实现如下:
class DSU:
def __init__(self, N):
self.root = [i for i in range(N)]
self.n = N
def find(self, k):
if self.root[k] != k:
self.root[k] = self.find(self.root[k])
return self.root[k]
def union(self, a, b):
x = self.find(a)
y = self.find(b)
if x != y:
self.root[y] = x
self.n -= 1
return
class Solution:
def minCost(self, n: int, edges: List[List[int]], k: int) -> int:
edges = sorted(edges, key=lambda x: x[2])
dsu = DSU(n)
ans = 0
for u,v,w in edges:
if dsu.n <= k:
break
ans = w
dsu.union(u, v)
return ans
提交代码评测得到:耗时123ms,占用内存65.55MB。