题目
有 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 # 节点到自身花费的时间为 0visited = {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: continuedist[node] = dfor 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]: # 只保留到达该节点最短的时间returndist[node] = total_timesfor 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/
