有 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] = w0int[][] 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;}
}