LeetCode - Network Delay Time

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:

  1. N will be in the range [1, 100].
  2. K will be in the range [1, N].
  3. The length of times will be in the range [1, 6000].
  4. 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