This medium LC question can be solved by using Djikstra algorithm. The goal is to find the individual distances of nodes from a given node. Then, the maximum distance will be the total network delay time.
The time complexity for this algorithm is O(NlogN + E), N = number of nodes and E = number of edges. The space complexity will be O(N) as well;
class Solution {
public int networkDelayTime(int[][] times, int N, int K) {
// use djikstra
// make an adjancecy map
// use priority queue to process nodes starting from K
// then start processing other neighbors
int result = 0;
final Map<Integer, List<int[]>> graph = new HashMap<>();
for(int[] time : times){
if(!graph.containsKey(time[0])){
graph.put(time[0], new ArrayList<>());
}
graph.get(time[0]).add(new int[]{time[1], time[2]});
}
final PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);
final Map<Integer, Integer> distMap = new HashMap<>();
pq.add(new int[] {K, 0});
while(!pq.isEmpty()){
int[] current = pq.poll();
int d = current[1];
int node = current[0];
if(distMap.containsKey(node)) continue;
distMap.put(node, d);
// explore the neighbors
if(graph.containsKey(node)){
final List<int[]> neighbors = graph.get(node);
for(int[] neighbor : neighbors){
int d2 = neighbor[1];
int n2 = neighbor[0];
if(!distMap.containsKey(n2)){
pq.add(new int[]{n2, d + d2});
}
}
}
}
if(distMap.size() != N) return -1;
for(Map.Entry<Integer, Integer> entry: distMap.entrySet()){
result = Math.max(result, entry.getValue());
}
return result;
}
}
Runtime: 35 ms, faster than 33.55% of Java online submissions for Network Delay Time. Memory Usage: 61.7 MB, less than 7.14% of Java online submissions for Network Delay Time.