有 N 个网络节点,标记为 1 到 N。
给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。
现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。
注意本题的w可以取到0,因此图初始化时节点值得大小不能为0,可以设为-1。
采用Dij算法解决
from typing import *
import sys
class Solution:
def networkDelayTime(self, times: List[List[int]], N: int, K: int) -> int:
graph = [[-1] * (N + 1) for _ in range(N + 1)]
for time in times:
graph[time[0]][time[1]] = time[2]
max_dist = max(self.Dij(graph, K, N))
return max_dist if max_dist < sys.maxsize else -1
def Dij(self, graph, start, N):
visited = [False] * (N + 1)
dist = [sys.maxsize] * (N + 1)
dist[start] = 0
for _ in range(N):
min_val = sys.maxsize
index = -1
for i in range(1, N + 1):
if not visited[i] and dist[i] < min_val:
min_val = dist[i]
index = i
if -1 == index:
break
visited[index] = True
for i in range(1, N + 1):
if not visited[i] and graph[index][i] != -1:
if dist[i] > (dist[index] + graph[index][i]):
dist[i] = dist[index] + graph[index][i]
return dist[1:]