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