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
  • 深度优先搜索
  • 广度优先搜索
  • 最短路
  • 堆(优先队列)
  • \n
  • 👍 395
  • 👎 0
  • 题解

    
    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)