📖 Scenario: You are working as a city planner. You have a map of cities connected by roads with distances. You want to find the shortest distance between every pair of cities to plan the best routes.
🎯 Goal: Build a program that uses the Floyd Warshall algorithm to find the shortest paths between all pairs of cities in a given map.
📋 What You'll Learn
Create a 2D array called dist representing the distances between cities.
Create a variable numCities to store the number of cities.
Implement the Floyd Warshall algorithm using three nested for loops with variables k, i, and j.
Update the dist array with the shortest distances.
Print the final dist array showing shortest distances between all city pairs.
💡 Why This Matters
🌍 Real World
City planners and GPS systems use all pairs shortest path algorithms to find the best routes between locations.
💼 Career
Understanding Floyd Warshall helps in roles involving route optimization, network analysis, and logistics planning.
Progress0 / 4 steps
1
Create the initial distance matrix
Create a 2D array called dist with these exact values representing distances between 4 cities. Use Infinity where there is no direct road: [[0, 5, Infinity, 10], [Infinity, 0, 3, Infinity], [Infinity, Infinity, 0, 1], [Infinity, Infinity, Infinity, 0]]
DSA Typescript
Hint
Use const dist: number[][] = [...] to create the matrix exactly as shown.
2
Set the number of cities
Create a variable called numCities and set it to the number of cities in the dist array.
DSA Typescript
Hint
Use const numCities: number = dist.length; to get the number of cities.
3
Implement the Floyd Warshall algorithm
Use three nested for loops with variables k, i, and j from 0 to numCities. Inside the innermost loop, update dist[i][j] to the minimum of its current value and dist[i][k] + dist[k][j].
DSA Typescript
Hint
Use three nested loops and update dist[i][j] if a shorter path is found through k.
4
Print the shortest distance matrix
Print the dist array after running the Floyd Warshall algorithm. Use console.log(dist) to display the final shortest distances between all pairs of cities.
DSA Typescript
Hint
Use console.log(dist) to print the final matrix.
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
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)).
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.
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
Step 1: Core idea
For each intermediate vertex k: is the path i→k→j shorter than the current best i→j?
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.
Final Answer:
min(dist[i][j], dist[i][k] + dist[k][j]) -> Option B
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
Step 1: Self-distance
dist[i][i] = 0 - zero cost to stay at the same vertex.
Step 2: No edge
dist[i][j] = Infinity when no direct edge exists - represents unreachable initially. In TypeScript: Infinity works correctly with Math.min().
Final Answer:
dist[i][i]=0, no edge=Infinity -> Option B
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
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.
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.
Final Answer:
k outermost, then i, then j. -> Option B
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
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).
Step 2: Detection
After the algorithm completes, check: for any i, if dist[i][i] < 0, a negative cycle exists involving i.
Final Answer:
Check dist[i][i] < 0 for any i. -> Option B
Quick Check:
Negative cycle: dist[i][i] < 0 after Floyd-Warshall. [OK]