有 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 <= 1001 <= times.length <= 6000times[i].length == 31 <= ui, vi <= nui != vi0 <= 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;
    }
} 
 



















