有 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)
对都 互不相同(即,不含重复边)
Related Topics
题解
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
private int totalTime = -1;
private int[] arriveTime;
private int[][] map;
public int networkDelayTime(int[][] times, int n, int k) {
map = new int[n+1][n+1];
for (int i = 0; i < map.length; i++) {
int[] tmp = new int[n+1];
Arrays.fill(tmp,-1);
map[i] =tmp;
}
arriveTime = new int[n+1];
Arrays.fill(arriveTime,-1);
//到自己的位置需要花费时间为0
arriveTime[k] = 0;
for (int[] time : times) {
//time[0];源节点 time[1];目标节点 time[2];时间
map[time[0]][time[1]] = time[2];
}
dfs(k,0);
int arrivedCount = 0;
for (int i = 1; i < arriveTime.length; i++) {
//i=-1表示没有到达这个点,
if (arriveTime[i]>=0){
arrivedCount++;
totalTime = Math.max(totalTime,arriveTime[i]);
}
}
return arrivedCount==n?totalTime:-1;
}
private void dfs(int startPoint,int time){
int[] branch = map[startPoint];
//从出发点开始,寻找可以走的下一步
for (int i = 0; i < branch.length; i++) {
//不等于0的 说明这条路是通的,可以访问,。
if (branch[i]>=0){
//走下一步的第二个条件,目标点没有走过 即还没记录过走到下一个点需要多久
//或者 到达目标点将要花费的时间比 现在 已知的走到下一个点的时间要短
if (arriveTime[i]==-1 || arriveTime[i] > time+branch[i]){
//更新 到达下个点的时间 或者是 更短的到达下个点的时间
arriveTime[i] = time+branch[i];
dfs(i,time+branch[i]);
}
}
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
发表评论