题目地址: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。
class Solution:
def networkDelayTime(self, times: List[List[int]], N: int, K: int) -> int:
g = {} # 构造图
for u, v, w in times:
g[u] = g.get(u, {})
g[u][v] = w
if K not in g:
return -1
# K到所有结点的初始距离
dists = [g[K].get(i, float('inf')) for i in range(1, N + 1)]
# 还未得到最短距离的所有结点,即除自身外的所有结点
points = list(range(1, K)) + list(range(K + 1, N + 1))
while points:
# 得到距离中的最小值和它的结点标识以及它在points里的index
minimum, _idx, _point = float('inf'), 0, 0
for idx, point in enumerate(points):
if dists[point-1] < minimum:
minimum, _idx, _point = dists[point-1], idx, point
points.pop(_idx) # O(1)时间移除该结点,remove是O(n)
if _point in g:
for v, w in g[_point].items():
if dists[v - 1] > w + minimum: # 以_point作为跳板可以更快到达v
dists[v - 1] = w + minimum
dists.pop(K-1) # 删除自己
time = max(dists)
if time == float('inf'):
return -1
return time
题目是求有权最短路径问题,对于权值都是正数的问题可以使用Dijkstra算法,算法详见:https://blog.csdn.net/qq_35644234/article/details/60870719