- [Leetcode 3608. Minimum Time for K Connected Components](#Leetcode 3608. Minimum Time for K Connected Components)
- [1. 解题思路](#1. 解题思路)
- [2. 代码实现](#2. 代码实现)
1. 解题思路
这一题思路上同样是一个DSU的思路,我们首先将所有的边按照失效时间由大到小排序,然后依次考察每一条边在失效之前其连通的簇的个数是否小于目标值 k k k,如果是,那么返回对应的边失效的时间即可,如果所有的边都没失效时依然满足条件,那么返回 0 0 0即可。
而关于DSU的相关内容,这里就不具体展开了,网上资料很多,我自己也有一篇水文《经典算法:并查集(DSU)结构简介》作为备忘,有兴趣的读者自己查查了解一下好了。
2. 代码实现
给出python代码实现如下:
python
class DSU:
def __init__(self, N):
self.root = [i for i in range(N)]
self.cluster = 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.cluster -= 1
return
class Solution:
def minTime(self, n: int, edges: List[List[int]], k: int) -> int:
dsu = DSU(n)
m = len(edges)
if m == 0:
return 0
edges = sorted(edges, key=lambda x: x[2], reverse=True)
idx = 0
while idx < m and dsu.cluster >= k:
u, v, t = edges[idx]
ans = t
dsu.union(u, v)
idx += 1
return ans if dsu.cluster < k else 0
提交代码评测得到:耗时121ms,占用内存60.3MB。