Bootstrap

Leetcode 3419. Minimize the Maximum Edge Weight of Graph

1. 解题思路

这一题我的思路就是二分法,找到能够完成遍历的临界值即可。

但是自己实际在做的时候是卡住了,并没有完全搞定,原因在于第三个限制条件的处理上不知道该怎么处理,不过后来看了一下大佬们的解答,发现他们根本没有去考虑第三个限制条件,就是直接找了从0开始能够到达每一个点时其所需要的临界值……

这个点还没有完全想明白,虽然构造反例一时半会是也没搞定,不过明确的证明倒是也没想明白,只能说先把答案放在这里了……

2. 代码实现

给出python代码实现如下:

class Solution:
    def minMaxWeight(self, n: int, edges: List[List[int]], threshold: int) -> int:
        graph = defaultdict(list)
        for u, v, w in edges:
            graph[v].append((u, w))
        for u in list(graph.keys()):
            graph[u] = sorted(graph[u], key=lambda x: x[1])

        def is_possbile(k):
            seen = {0}
            q = [0]
            while q:
                u = q.pop(0)
                for v, w in graph[u]:
                    if w > k:
                        break
                    if v in seen:
                        continue
                    q.append(v)
                    seen.add(v)
            return len(seen) == n
        
        i, j = 0, max(w for u, v, w in edges)
        if not is_possbile(j):
            return -1
        while j-i > 1:
            k = (i+j) // 2
            if is_possbile(k):
                j = k
            else:
                i = k
        return j 

提交代码评测得到:耗时1754ms,占用内存74.3MB。

3. 算法优化

后续注意到,由于这里没有使用第三个限制条件,因此事实上这里就是求从0开始到达每一个点时的各个最小距离的最大值,因此事实上我们可以用一个图的遍历来直接获取从0开始到达每一个点时所需要的最小距离。

给出python代码实现如下:

class Solution:
    def minMaxWeight(self, n: int, edges: List[List[int]], threshold: int) -> int:
        graph = defaultdict(list)
        for u, v, w in edges:
            graph[v].append((u, w))
        
        reached = set()
        ans = 0
        q = [(0, 0)]
        while q:
            d, u = heapq.heappop(q)
            if u in reached:
                continue
            reached.add(u)
            ans = max(ans, d)
            for v, w in graph[u]:
                if v in reached:
                    continue
                nd = max(w, d)
                heapq.heappush(q, (nd, v))
        return ans if len(reached) == n else -1

提交代码评测得到:耗时548ms,占用内存74.4MB。

;