有 n
个网络节点,标记为 1
到 n
。
给你一个列表 times
,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi)
,其中 ui
是源节点,vi
是目标节点, wi
是一个信号从源节点传递到目标节点的时间。
现在,从某个节点 K
发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1
。
示例 1:
输入: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)
对都 互不相同(即,不含重复边)
我的解答:
class Solution {
public int networkDelayTime(int[][] times, int n, int k) {
// 即n * (n - 1) * 100,所有节点互相发信号的所需的最长时间
final int TIME_OUT =1_000_000;
// 用于存放所有节点链接可能的所需时间,如节点1到节点2的所需时间为circuit[0][1] = w0
int[][] circuit = new int[n][n];
for(int i = 0; i < n; i++){
// 初始化所有节点到其他节点的所需时间
Arrays.fill(circuit[i], TIME_OUT);
}
for(int[] time : times){
// 给所有连通的节点赋予其真实所需时间
circuit[ time[0] - 1 ][ time[1] - 1 ] = time[2];
}
// 记录到达该目标节点最短所需时间
int[] dist = new int[n];
// 初始化节点,默认无法到达,时间超时
Arrays.fill(dist,TIME_OUT);
// 起点不消耗时间
dist[k - 1] = 0;
boolean[] flag = new boolean[n];
for(int i = 0; i < n; i++){
int x = -1;
for(int y = 0; y < n; y++){
// 找到当前未被标识的达到所需时间最短的目标节点,使其作为当前源节点
if(!flag[y] && (x == -1 || dist[y] < dist[x])){
x = y;
}
}
// 标识已确认源节点
flag[x] = true;
for(int y = 0; y < n; y++){
// 遍历源节点到其他节点的时间
dist[y] = Math.min(dist[y], dist[x] + circuit[x][y] );
}
}
// 走到耗时最长的节点所需的时间,能同时走完其他节点
int res = Arrays.stream(dist).max().getAsInt();
// 如果该时长为超时时长,则说明有节点不可到达
return res == TIME_OUT ? -1:res;
}
}