743. 网络延迟时间
https://leetcode-cn.com/problems/network-delay-time/
有 N 个网络节点,标记为 1 到 N。给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。
注意:N 的范围在 [1, 100] 之间。K 的范围在 [1, N] 之间。times 的长度在 [1, 6000] 之间。所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100。
题解
一:典型的带权图的最短单源路径问题,用迪杰特斯拉(Dijkstra算法)
from heapq import heappop, heappush
class Solution(object):
def networkDelayTime(self, times, N, K):
"""
:type times: List[List[int]]
:type N: int
:type K: int
:rtype: int
"""
G = [{} for _ in range(N + 1)]
for v, w, time in times:
G[v][w] = time
visited = [False] * (N + 1)
dis = [float("inf")] * (N + 1)
pq = []
heappush(pq, (0, K))
dis[K] = 0
res = 0
while pq:
# 找出未确定最短路径的最小值对应的顶点
time, cur = heappop(pq)
if visited[cur]:
continue
# 确定该顶点,用visited对应位标True
visited[cur] = True
res = max(res, time)
# 以该点出发,寻找其邻边,若通过该点达到比之前小的值,入队并更新距离
for w in G[cur]:
new_time = dis[cur] + G[cur][w]
if not visited[w] and new_time < dis[w]:
dis[w] = new_time
heappush(pq, (new_time, w))
for i in range(1, N + 1):
if not visited[i]:
return -1
return res