Question Definition
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.Java Solution
public int networkDelayTime(int[][] times, int N, int K) { int r = times.length, max = Integer.MAX_VALUE; Map<Integer,List<Integer>> map = new HashMap<>(); for(int i=0;i<r;i++){ int[] nums = times[i]; int u = nums[0]; int v = nums[1]; List<Integer> list = map.getOrDefault(u,new ArrayList<>()); list.add(i); map.put(u,list); } if(map.get(K) == null){ return -1;// no immediate neighbor of node K, so return -1 } int[] dist = new int[N+1];//dist[i] is the time taken to reach node i from node k Arrays.fill(dist,max); dist[K] = 0; Queue<Integer> queue = new LinkedList<>(); queue.add(K); while(!queue.isEmpty()){ int u = queue.poll(); int t = dist[u]; List<Integer> list = map.get(u);// get the indices of all the neighbors of node u if(list == null) continue; for(int n:list){ int v = times[n][1]; int time = times[n][2];// time taken to reach from u to v if(dist[v] > t + time){// if time taken to reach v from k is greater than time taken to reach from k to u + time taken to reach from u to v, then update dist[v] dist[v] = t + time; queue.add(v);// as we have found shorter distance to node v, explore all neighbors of v } } } int res = -1; for(int i=1;i<=N;i++){ int d = dist[i]; if(d == max){// if d is max, it means node i can not be reached from K, so return -1 return -1; } res = d > res ? d : res; } return res; }
Comments