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。