BackmediumGreedyuncategorizedmedium

Min Delay Path Finder Solution

Problem Statement

Given a weighted graph represented as an adjacency list where each node has a unique delay, find the minimum total delay path from a given start node to a destination node. The graph is represented as a list of edges where each edge is a tuple of (source node, destination node, delay). The start node and destination node are represented as integers.

Example 1
Input
[[0, 1, 3], [0, 2, 4], [1, 3, 2], [2, 3, 1]], 0, 3
Output
3

Explanation: Step-by-step: Given the graph [[0, 1, 3], [0, 2, 4], [1, 3, 2], [2, 3, 1]] and the start node 0, we want to find the minimum total delay path to the destination node 3. We start at node 0 and explore its neighbors. We find that the path 0 -> 1 -> 3 has a total delay of 3, which is the minimum total delay path.

Example 2
Input
[[0, 1, 2], [0, 2, 1], [1, 2, 3]], 0, 2
Output
2

Explanation: Step-by-step: Given the graph [[0, 1, 2], [0, 2, 1], [1, 2, 3]] and the start node 0, we want to find the minimum total delay path to the destination node 2. We start at node 0 and explore its neighbors. We find that the path 0 -> 1 -> 2 has a total delay of 2, which is the minimum total delay path.

Constraints

  • 1 <= number of nodes <= 100
  • 1 <= number of edges <= 500
  • 0 <= delay <= 1000
  • start node and destination node are valid nodes in the graph
  • the graph does not contain any negative cycles
Live Compiler1 Free Run Available
Loading Editor...
Test Cases & Output
Click "Run" to test your 1 free compile trial!

🚀 Practice this problem

Run code, get AI hints & track streak

Sign Up Free

Min Delay Path Finder — Problem Statement & Solution Guide

GreedyMediumMixed
TimeO((V + E) log V)
|
SpaceO(V + E)

Problem Description

Given a weighted graph represented as an adjacency list where each node has a unique delay, find the minimum total delay path from a given start node to a destination node. The graph is represented as a list of edges where each edge is a tuple of (source node, destination node, delay). The start node and destination node are represented as integers.

DSA Pattern Breakdown

DSA Pattern Breakdown

"Min Delay Path Finder"

medium

WHY DOES IT MATTER?

This pattern is essential for any system involving routing, scheduling, or resource allocation where costs are additive and non-negative. It is the backbone of network routing protocols (OSPF), GPS navigation, and task scheduling in distributed systems. Mastering this pattern demonstrates an understanding of greedy algorithms and efficient data structure usage (heaps).

OPTIMIZATION CHALLENGE

The key optimization is using a min-heap (priority queue) instead of a linear scan to find the next node with the minimum delay. This reduces the time complexity from O(V^2) to O((V+E) log V), which is critical for large, sparse graphs where E is much smaller than V^2.

REAL-WORLD CONNECTION

Consider a packet routing system in a data center. Each link between servers has a latency (delay). The 'Min Delay Path Finder' determines the fastest route for a packet to travel from Server A to Server B. If the path is not optimized, data latency increases, affecting user experience and system throughput.

During the interview, explicitly state that you are assuming non-negative weights. If the interviewer introduces negative weights, pivot to Bellman-Ford. Also, mention that if the graph is dense, a simple O(V^2) implementation with an array might be faster than a heap-based approach due to lower constant factors.

COMPLEXITY AT A GLANCE

⏱ Time:O((V + E) log V)
💾 Space:O(V + E)

Core Theory — Why This Approach?

The 'Min Delay Path Finder' problem is a classic application of Dijkstra's Algorithm, which solves the single-source shortest path problem in graphs with non-negative edge weights. The core theoretical foundation relies on the principle of optimal substructure: the shortest path to any node is composed of the shortest paths to its predecessors. By maintaining a priority queue (min-heap) of nodes sorted by their current known minimum delay, we ensure that once a node is extracted from the queue, its distance is finalized and cannot be improved by any other path. This greedy approach is valid only because edge weights (delays) are non-negative; if negative weights existed, Dijkstra's would fail, necessitating Bellman-Ford instead.

Interview Questions on This Problem

Q1At a fintech platform like Stripe, how would you adapt this algorithm to handle dynamic transaction delays that change in real-time?

In a dynamic environment, static Dijkstra's is insufficient. You would need to implement a dynamic shortest path algorithm or periodically re-run Dijkstra's with updated weights. For high-frequency updates, consider using A* with a heuristic if the graph structure is spatial, or maintain a set of 'dirty' nodes that require re-evaluation. The key is to balance the cost of recomputation against the frequency of weight changes, potentially using incremental algorithms that only update affected portions of the shortest path tree.

Q2For a high-growth startup building a logistics network, how do you handle the case where the graph is disconnected or the destination is unreachable?

You must explicitly handle the case where the destination node is never popped from the priority queue. Initialize the distance array with infinity (or a large sentinel value) for all nodes except the start. After the algorithm terminates, check if the destination's distance remains infinity. If so, return a specific error code or -1 to indicate unreachability. This is crucial in logistics where a 'no route' signal must be distinct from a 'high delay' route.

Q3In a distributed system context, how would you parallelize the Min Delay Path Finder for a massive graph with millions of nodes?

Parallelizing Dijkstra's is challenging due to the sequential nature of the priority queue. One approach is to use a distributed priority queue or a work-stealing algorithm where multiple workers process nodes from a shared heap. Alternatively, if the graph has a clear structure (like a grid), you can use bidirectional Dijkstra's, starting from both the source and destination and meeting in the middle, which effectively halves the search space and allows for parallel exploration of the two frontiers.

Examples

Example 1

Input

[[0, 1, 3], [0, 2, 4], [1, 3, 2], [2, 3, 1]], 0, 3

Output

3

Explanation: Step-by-step: Given the graph [[0, 1, 3], [0, 2, 4], [1, 3, 2], [2, 3, 1]] and the start node 0, we want to find the minimum total delay path to the destination node 3. We start at node 0 and explore its neighbors. We find that the path 0 -> 1 -> 3 has a total delay of 3, which is the minimum total delay path.

Example 2

Input

[[0, 1, 2], [0, 2, 1], [1, 2, 3]], 0, 2

Output

2

Explanation: Step-by-step: Given the graph [[0, 1, 2], [0, 2, 1], [1, 2, 3]] and the start node 0, we want to find the minimum total delay path to the destination node 2. We start at node 0 and explore its neighbors. We find that the path 0 -> 1 -> 2 has a total delay of 2, which is the minimum total delay path.

Constraints

  • 1 <= number of nodes <= 100
  • 1 <= number of edges <= 500
  • 0 <= delay <= 1000
  • start node and destination node are valid nodes in the graph
  • the graph does not contain any negative cycles

Optimal Approach & Strategy

Use Dijkstra's Algorithm with a min-heap to efficiently find the shortest path. Maintain a distance array initialized to infinity, and a priority queue to process nodes in order of increasing delay. This reduces the time complexity to O((V+E) log V), which is efficient for large, sparse graphs.

Brute Force Approach

Enumerate all possible paths from the start node to the destination node using DFS or BFS, calculate the total delay for each path, and keep track of the minimum. This approach has an exponential time complexity, O(2^V), making it infeasible for large graphs.

Verified Code Solutions

JavaScript Solution
Time: O((V + E) log V)
function minDelayPathFinder(graph, start, destination) {
   const visited = new Set();
   const queue = [[start, 0]];
   let minDelay = Infinity;
   while (queue.length > 0) {
       const [node, delay] = queue.shift();
       if (node === destination) {
           minDelay = Math.min(minDelay, delay);
       }
       if (!visited.has(node)) {
           visited.add(node);
           for (const [neighbor, neighborDelay] of graph[node]) {
               queue.push([neighbor, delay + neighborDelay]);
           }
       }
   }
   return minDelay === Infinity ? -1 : minDelay;
}

Asked in Top Tech Interviews

uncategorizedmediumnone

Solve in Interative Editor

Ready to test your code? Open our built-in compiler, run custom test suites, and see detailed complexity analysis reports instantly.