743. network delay time



Leetcode
Heap
Depth-first Search
Breath-first Search
Graph

There are N network nodes, labelled 1 to N.

Given times, a list of travel times as directed edges times[i] = (u, v, w), where u is the source node, v is the target node, and w is the time it takes for a signal to travel from source to target.

Now, we send a signal from a certain node K. How long will it take for all nodes to receive the signal? If it is impossible, return -1.

Note:

  • N will be in the range [1, 100].
  • K will be in the range [1, N].
  • The length of times will be in the range [1, 6000].
  • All edges times[i] = (u, v, w) will have 1 <= u, v <= N and 1 <= w <= 100.

分析

这道题目思路是非常直接的。题目都说了有向图directed graph,并且需要求最长的最短路径。那么就是题目就转化为shortest path of directed graph. 由于所有路径都为正数,可以使用经典的Dijkstra's algorithm.

public int networkDelayTime(int[][] times, int N, int K) {
    int[] distTo = new int[N + 1];
    PriorityQueue<int[]> pq = new PriorityQueue<>((o1, o2)->o1[1]-o2[1]);
    Arrays.fill(distTo, Integer.MAX_VALUE);

    //construct graph
    Map<Integer, Integer>[] graph = 
        (HashMap<Integer, Integer>[]) new HashMap<?, ?>[N + 1];
    for (int i = 1; i < N + 1; i++) 
        graph[i] = new HashMap<>();
    for (int[] time : times) 
        graph[time[0]].put(time[1], time[2]);

    // dijkstra algorithm
    distTo[K] = 0;
    pq.offer(new int[]{K, distTo[K]});
    while (!pq.isEmpty()) {
        int v = pq.poll()[0];
        Map<Integer, Integer> distFromV = graph[v];
        for (int w : distFromV.keySet())
            if (distTo[w] > distTo[v] + distFromV.get(w)) {
                pq.remove(new int[]{w, distTo[w]});
                distTo[w] = distTo[v] + distFromV.get(w);
                pq.offer(new int[]{w, distTo[w]});
            }
    }

    // find min
    int maxLength = -1;
    for (int i = 1; i <= N; i++)
        if (distTo[i] == Integer.MAX_VALUE)
            return -1;
        else if (i != K && distTo[i] > maxLength)
            maxLength = distTo[i];
    return maxLength;
}