0743. 网络延迟时间【中等】
1. 📝 题目描述
有 n 个网络节点,标记为 1 到 n。
给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。
现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。
示例 1:

txt
输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
输出:21
2
2
示例 2:
txt
输入:times = [[1,2,1]], n = 2, k = 1
输出:11
2
2
示例 3:
txt
输入:times = [[1,2,1]], n = 2, k = 2
输出:-11
2
2
提示:
1 <= k <= n <= 1001 <= times.length <= 6000times[i].length == 31 <= ui, vi <= nui != vi0 <= wi <= 100- 所有
(ui, vi)对都 互不相同(即,不含重复边)
2. 🎯 s.1 - Bellman-Ford
c
#define INF 0x3f3f3f3f
int networkDelayTime(int** times, int timesSize, int* timesColSize, int n, int k) {
int* dist = (int*)malloc(sizeof(int) * (n + 1));
for (int i = 0; i <= n; i++) dist[i] = INF;
dist[k] = 0;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < timesSize; j++) {
int u = times[j][0], v = times[j][1], w = times[j][2];
if (dist[u] != INF && dist[u] + w < dist[v])
dist[v] = dist[u] + w;
}
}
int res = 0;
for (int i = 1; i <= n; i++) {
if (dist[i] == INF) { free(dist); return -1; }
if (dist[i] > res) res = dist[i];
}
free(dist);
return res;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
js
/**
* @param {number[][]} times
* @param {number} n
* @param {number} k
* @return {number}
*/
var networkDelayTime = function (times, n, k) {
const dist = new Array(n + 1).fill(Infinity)
dist[k] = 0
for (let i = 0; i < n - 1; i++) {
for (const [u, v, w] of times) {
if (dist[u] !== Infinity && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w
}
}
}
let res = 0
for (let i = 1; i <= n; i++) {
if (dist[i] === Infinity) return -1
res = Math.max(res, dist[i])
}
return res
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
py
class Solution:
def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
dist = [float('inf')] * (n + 1)
dist[k] = 0
for _ in range(n - 1):
for u, v, w in times:
if dist[u] + w < dist[v]:
dist[v] = dist[u] + w
res = max(dist[1:])
return res if res < float('inf') else -11
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- 时间复杂度:
,其中 n 是节点数,m 是边数 - 空间复杂度:
算法思路:
- 使用 Bellman-Ford 算法,进行 n-1 轮松弛操作
- 每轮遍历所有边,尝试更新最短距离
- 最终结果为所有节点最短距离的最大值,若有不可达则返回 -1