题目
有 N 个网络节点,标记为 1 到 N。
给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w)
,其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。
现在,我们从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。
示例:
输入:times = [[2,1,1],[2,3,1],[3,4,1]], N = 4, K = 2
输出:2
注意:
- N 的范围在
[1, 100]
之间。 - K 的范围在
[1, N]
之间。 - times 的长度在
[1, 6000]
之间。 所有的边
times[i] = (u, v, w)
都有1 <= u, v <= N
且0 <= w <= 100
。方案一(Dijstra算法)
class Solution:
def networkDelayTime(self, times: List[List[int]], N: int, K: int) -> int:
# 问题可以转换为从节点 K 出发,求到最远的一个节点所花费的时间
# 改为邻接表存储
# key: 源节点, value: [(传递的时间, 目标节点)]
adj = {key: [] for key in range(1, N + 1)}
for time in times:
adj[time[0]].append((time[2], time[1]))
# dijkstra 算法,已将时间转换为 负数,方便使用最小堆
min_distances = [float("inf")] * N # 第 i 个元素表示从节点 K 到 i 的最短花费时间
min_distances[K-1] = 0 # 节点到自身花费的时间为 0
visited = {K, } # 防止环造成的无限循环
heap = adj[K][:]
heapq.heapify(heap)
while heap:
total_t, node = heapq.heappop(heap)
visited.add(node)
min_distances[node-1] = min(total_t, min_distances[node-1])
for t, next_node in adj[node]:
if next_node not in visited:
heapq.heappush(heap, (t + total_t, next_node))
ans = max(min_distances)
return -1 if ans == float("inf") else ans
官方实现方式
class Solution(object):
def networkDelayTime(self, times, N, K):
graph = collections.defaultdict(list)
for u, v, w in times:
graph[u].append((v, w))
pq = [(0, K)]
dist = {}
while pq:
d, node = heapq.heappop(pq)
if node in dist: continue
dist[node] = d
for nei, d2 in graph[node]:
if nei not in dist:
heapq.heappush(pq, (d+d2, nei))
return max(dist.values()) if len(dist) == N else -1
方案二(深度优先搜索)
```python class Solution: def networkDelayTime(self, times: List[List[int]], N: int, K: int) -> int:
# 深度优先搜索
graph = collections.defaultdict(list)
for u, v, w in times:
graph[u].append((w, v))
dist = {node: float('inf') for node in range(1, N+1)} # 最早到达节点的时间
def dfs(node, total_times):
# node: 信号到达的节点
# total_times: 信号到达的时间
if total_times >= dist[node]: # 只保留到达该节点最短的时间
return
dist[node] = total_times
for w, v in graph[node]:
dfs(v, total_times + w)
dfs(K, 0)
ans = max(dist.values())
return ans if ans < float('inf') else -1
原文
https://leetcode-cn.com/problems/network-delay-time/
https://leetcode-cn.com/problems/network-delay-time/solution/wang-luo-yan-chi-shi-jian-by-leetcode/