743. Network Delay Time

We’re given a list of tuples representing edges in the times input of the format (u_i, v_i, w_i) where u is the start node, v is the end node, and w is the weight of the edge. Given a starting node, k, we’re asked to find the minimum time it takes for all nodes in the graph to be reached. If we can’t reach all the nodes from the starting node, we return -1.

This is a common Dijkstra’s algorithm question, super similar to DFS except edges are directional and weighted. We construct a normal Dijkstra’s algorithm search. Once the search is complete, we take the maximum distance from the distances array. If float(“inf”) is still present in the distances array, we know that not all nodes were reached, so we return -1. Otherwise, we return the max distance.

The solution is as follows:

from collections import defaultdict
from heapq import heappush, heappop
 
class Solution:
    def networkDelayTime(self, times: List[List[int]], n: int, k: int) -> int:
        distances = [float("inf") for _ in range(n)]
        distances[k - 1] = 0
        heap, edges = [(distances[k - 1], k - 1)], defaultdict(list)
 
        for u, v, w in times:
            edges[u - 1].append((v - 1, w))
 
        while heap:
            curr_dist, u = heappop(heap)
 
            if curr_dist > distances[u]:
                continue
 
            neighbors = edges[u]
 
            for v, w in neighbors:
                dist = curr_dist + w
 
                if dist < distances[v]:
                    distances[v] = dist
                    heappush(heap, (dist, v))
 
        ans = max(distances)
        return ans if ans != float("inf") else -1

_ Time Complexity:

O(n + elog(n)) - Where n is the number of nodes and e is the number of edges, this is the runtime of Dijkstra’s algorithm. We also have to add the time complexity for n, as we select for the max distance in the distance array.

_ Space Complexity:

O(n + e) - Building the adjaceny list takes e space. The distances array takes n space.