Bird
Raised Fist0
DSA Typescriptprogramming~5 mins

Floyd Warshall All Pairs Shortest Path in DSA Typescript - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Floyd Warshall All Pairs Shortest Path
O(n³)
Understanding Time Complexity

We want to understand how the time needed to find shortest paths between all pairs of points grows as the number of points increases.

How does the running time change when the graph size grows?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


function floydWarshall(graph: number[][]): number[][] {
  const dist = graph.map(row => row.slice());
  const n = graph.length;
  for (let k = 0; k < n; k++) {
    for (let i = 0; i < n; i++) {
      for (let j = 0; j < n; j++) {
        if (dist[i][k] + dist[k][j] < dist[i][j]) {
          dist[i][j] = dist[i][k] + dist[k][j];
        }
      }
    }
  }
  return dist;
}
    

This code finds the shortest distances between every pair of points in a graph using three nested loops.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: The triple nested loops that update distances.
  • How many times: Each loop runs from 0 to n-1, so the innermost operation runs about n x n x n = n³ times.
How Execution Grows With Input

As the number of points (n) grows, the number of operations grows very fast because every pair of points is checked for every possible intermediate point.

Input Size (n)Approx. Operations
101,000
1001,000,000
10001,000,000,000

Pattern observation: When n increases ten times, operations increase about a thousand times (n³ growth).

Final Time Complexity

Time Complexity: O(n³)

This means the time needed grows very quickly as the graph size grows, roughly proportional to the cube of the number of points.

Common Mistake

[X] Wrong: "Since there are three loops, the time complexity is O(n) because loops run one after another."

[OK] Correct: The loops are nested, not sequential, so the total operations multiply, making it O(n³), not just O(n).

Interview Connect

Understanding this algorithm's time complexity helps you explain how nested loops affect performance and why some algorithms are slower on bigger inputs. This skill is valuable for solving real problems efficiently.

Self-Check

"What if we replaced the triple nested loops with a recursive approach that splits the graph? How might that affect the time complexity?"

Practice

(1/5)
1. What does Floyd-Warshall compute that single-source shortest path algorithms like Dijkstra do not?
easy
A. Shortest path from one source to all vertices
B. Shortest paths between ALL pairs of vertices in one run
C. Minimum spanning tree of the graph
D. Topological order of vertices

Solution

  1. Step 1: Single-source vs all-pairs

    Dijkstra/Bellman-Ford compute shortest paths from ONE source to all others. To get all-pairs with Dijkstra, run it V times = O(V(E + V log V)).
  2. Step 2: Floyd-Warshall

    Floyd-Warshall computes shortest paths between every pair (i,j) in a single O(V³) pass. Simpler to implement for dense graphs.
  3. Final Answer:

    All-pairs shortest paths in one pass. -> Option B
  4. Quick Check:

    Floyd-Warshall = all-pairs. Dijkstra = single-source. [OK]
Hint: Floyd-Warshall = all-pairs shortest path. O(V³) time, O(V²) space. [OK]
Common Mistakes:
  • Confusing with Dijkstra (single-source)
  • Thinking it finds MST
  • Confusing with topological sort
2. What is the Floyd-Warshall recurrence? dist[i][j] after considering vertex k as intermediate is:
medium
A. dist[i][j] = dist[i][k] + dist[k][j]
B. dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
C. dist[i][j] = max(dist[i][j], dist[i][k] + dist[k][j])
D. dist[i][j] = dist[i][k] * dist[k][j]

Solution

  1. Step 1: Core idea

    For each intermediate vertex k: is the path i→k→j shorter than the current best i→j?
  2. Step 2: Recurrence

    dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]). Keep the minimum of: current best OR going through k.
  3. Final Answer:

    min(dist[i][j], dist[i][k] + dist[k][j]) -> Option B
  4. Quick Check:

    Always take the minimum - relaxation. [OK]
Hint: Floyd-Warshall: dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]). Relax via each intermediate k. [OK]
Common Mistakes:
  • Using + without min (overwrites current best)
  • Using max instead of min
  • Multiplying instead of adding edge weights
3. In TypeScript, how do you initialize dist[i][i] and dist[i][j] (no direct edge) for Floyd-Warshall?
medium
A. dist[i][i] = 0, dist[i][j] = -1
B. dist[i][i] = 0, dist[i][j] = Infinity
C. dist[i][i] = 1, dist[i][j] = 0
D. dist[i][i] = Infinity, dist[i][j] = Infinity

Solution

  1. Step 1: Self-distance

    dist[i][i] = 0 - zero cost to stay at the same vertex.
  2. Step 2: No edge

    dist[i][j] = Infinity when no direct edge exists - represents unreachable initially. In TypeScript: Infinity works correctly with Math.min().
  3. Final Answer:

    dist[i][i]=0, no edge=Infinity -> Option B
  4. Quick Check:

    Self=0, no edge=Infinity. Infinity + x = Infinity in JS - works with min(). [OK]
Hint: Init: self=0, no edge=Infinity. TypeScript Infinity works correctly with Math.min(). [OK]
Common Mistakes:
  • Using -1 for no edge (breaks min comparison)
  • Setting self-distance to Infinity
  • Using 0 for no edge (treats as zero-weight edge)
4. What is the correct loop order for Floyd-Warshall in TypeScript?
hard
A. for i → for j → for k
B. for k → for i → for j
C. for i → for k → for j
D. for j → for k → for i

Solution

  1. Step 1: Why k is outermost

    k is the intermediate vertex being 'unlocked' at each outer iteration. When we process intermediate k, all pairs i→j must be relaxed using k.
  2. Step 2: Correctness

    If k is innermost, we might use a later-unlocked vertex when relaxing - violating the DP ordering. k must be outermost so all (i,j) pairs are fully relaxed before moving to k+1.
  3. Final Answer:

    k outermost, then i, then j. -> Option B
  4. Quick Check:

    Floyd-Warshall loop order: k→i→j. k must be outermost. [OK]
Hint: Loop order: k (intermediate) → i (source) → j (dest). k must be outermost - critical for correctness. [OK]
Common Mistakes:
  • Putting i outermost (most common mistake)
  • Putting j outermost
  • Any order other than k→i→j gives wrong results
5. How do you detect a negative cycle using Floyd-Warshall after completion?
hard
A. Check if any dist[i][j] === -Infinity
B. Check if any dist[i][i] < 0 - a vertex with negative self-distance indicates a negative cycle
C. Check if the total sum of all dist values is negative
D. Run the algorithm a second time and compare results

Solution

  1. Step 1: Negative cycle effect

    If a negative cycle exists reachable from i back to i, the shortest path dist[i][i] will become negative (going around the cycle reduces cost below 0).
  2. Step 2: Detection

    After the algorithm completes, check: for any i, if dist[i][i] < 0, a negative cycle exists involving i.
  3. Final Answer:

    Check dist[i][i] < 0 for any i. -> Option B
  4. Quick Check:

    Negative cycle: dist[i][i] < 0 after Floyd-Warshall. [OK]
Hint: Negative cycle detection: dist[i][i] < 0 after Floyd-Warshall. Self-distance going negative = cycle. [OK]
Common Mistakes:
  • Checking dist[i][j] for non-self pairs
  • Summing all distances
  • Running algorithm twice
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard