友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

743. 网络延迟时间

n 个网络节点,标记为 1n

给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。

现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1

示例 1:

0743 01
输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
输出:2

示例 2:

输入:times = [[1,2,1]], n = 2, k = 1
输出:1

示例 3:

输入:times = [[1,2,1]], n = 2, k = 2
输出:-1

提示:

  • 1 <= k <= n <= 100

  • 1 <= times.length <= 6000

  • times[i].length == 3

  • 1 <= ui, vi <= n

  • ui != vi

  • 0 <= wi <= 100

  • 所有 (ui, vi) 对都 互不相同(即,不含重复边)

思路分析

没想到竟然是图的最短路径问题。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2026-06-04 22:26:14
 */
public int networkDelayTime(int[][] times, int n, int k) {
  final int INF = Integer.MAX_VALUE / 2;
  int[][] graph = new int[n][n];
  for (int[] row : graph) {
    Arrays.fill(row, INF);
  }
  for (int[] t : times) {
    graph[t[0] - 1][t[1] - 1] = t[2];
  }
  int max = 0;
  int[] distances = new int[n];
  Arrays.fill(distances, INF);
  distances[k - 1] = 0;
  boolean[] done = new boolean[n];
  while (true) {
    int x = -1;
    for (int i = 0; i < n; i++) {
      if (!done[i] && (x < 0 || distances[i] < distances[x])) {
        x = i;
      }
    }
    if (x < 0) {
      return max; // 最后一次算出的最短路就是最大的
    }
    if (distances[x] == INF) { // 有节点无法到达
      return -1;
    }
    max = distances[x]; // 求出的最短路会越来越大
    done[x] = true; // 最短路长度已确定(无法变得更小)
    for (int y = 0; y < n; y++) {
      distances[y] = Math.min(distances[y], distances[x] + graph[x][y]);
    }
  }
}