Floyd Warshall All Pairs Shortest Path in DSA C# - Time & Space 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 we add more points to the map?
Analyze the time complexity of the following code snippet.
for (int k = 0; k < n; k++)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (dist[i, k] + dist[k, j] < dist[i, j])
dist[i, j] = dist[i, k] + dist[k, j];
}
}
}
This code updates the shortest distances between all pairs of points by checking if going through an intermediate point k gives a shorter path.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The triple nested loops that update distances.
- How many times: Each loop runs n times, so the inner update runs n x n x n = n³ times.
As the number of points n grows, the number of operations grows very fast because we check every pair with every possible intermediate point.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 1,000 |
| 100 | 1,000,000 |
| 1000 | 1,000,000,000 |
Pattern observation: When n increases 10 times, operations increase 1000 times (cube growth).
Time Complexity: O(n³)
This means the time needed grows roughly with the cube of the number of points, so doubling points makes it take about eight times longer.
[X] Wrong: "Since there are three loops, the time complexity is just O(n)."
[OK] Correct: Each loop runs n times independently, so the total work multiplies, making it n x n x n = n³, not just n.
Understanding this cubic time complexity helps you explain why Floyd Warshall is good for small graphs but not for very large ones, showing you know when to choose algorithms wisely.
"What if we replaced the triple nested loops with a recursive approach? How would the time complexity change?"
Practice
Floyd Warshall algorithm in graph theory?Solution
Step 1: Understand Floyd Warshall's goal
The Floyd Warshall algorithm calculates shortest paths between every pair of vertices in a weighted graph, including negative weights but no negative cycles.Step 2: Compare with other algorithms
Minimum spanning tree algorithms find a tree connecting all vertices with minimum total weight, cycle detection finds loops, and DFS is a traversal method, none of which match Floyd Warshall's purpose.Final Answer:
To find the shortest paths between all pairs of vertices in a weighted graph -> Option DQuick Check:
Floyd Warshall = All pairs shortest paths [OK]
- Confusing with minimum spanning tree algorithms
- Thinking it only finds shortest path from one source
- Assuming it works with negative cycles
dist for Floyd Warshall in C# when given an adjacency matrix graph of size V?Solution
Step 1: Understand initialization for Floyd Warshall
The distance matrixdistshould start as a copy of the adjacency matrixgraphbecause it holds initial edge weights or infinity where no edge exists.Step 2: Check each option
for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { dist[i, j] = graph[i, j]; } } copiesgraphtodist, which is correct. for (int i = 0; i < V; i++) { dist[i, i] = 0; } for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { if (i != j) dist[i, j] = int.MaxValue; } } sets 0 for diagonal and max value elsewhere but does not copy actual edges. Options C and D incorrectly set all distances to 0 or -1.Final Answer:
for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { dist[i, j] = graph[i, j]; } } -> Option AQuick Check:
Initialize dist as graph copy [OK]
- Setting all distances to zero
- Not copying actual edge weights
- Using -1 instead of infinity for no edge
int V = 3;
int[,] graph = {
{0, 5, int.MaxValue},
{50, 0, 15},
{30, int.MaxValue, 0}
};
int[,] dist = new int[V, V];
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
dist[i, j] = graph[i, j];
for (int k = 0; k < V; k++) {
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
if (dist[i, k] != int.MaxValue && dist[k, j] != int.MaxValue && dist[i, k] + dist[k, j] < dist[i, j]) {
dist[i, j] = dist[i, k] + dist[k, j];
}
}
}
}
// Print dist matrix
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
Console.Write(dist[i, j] == int.MaxValue ? "INF " : dist[i, j] + " ");
}
Console.WriteLine();
}What is the printed output?
Solution
Step 1: Initialize dist matrix
dist starts as: 0 5 INF 50 0 15 30 INF 0Step 2: Apply Floyd Warshall updates
Check paths through each vertex k: - k=0: Update dist[1,2] via 1->0->2: 50 + INF no update; dist[2,1] via 2->0->1: 30 + 5 = 35 < INF, update dist[2,1] = 35 - k=1: Update dist[0,2] via 0->1->2: 5 + 15 = 20 < INF, update dist[0,2] = 20 - k=2: No further improvements Final dist: 0 5 20 45 0 15 30 35 0Final Answer:
0 5 20 45 0 15 30 35 0 -> Option BQuick Check:
Floyd Warshall updates shortest paths correctly [OK]
- Not updating dist when shorter path found
- Confusing INF with int.MaxValue in output
- Missing updates for indirect paths
int V = 3;
int[,] dist = new int[V, V];
for (int i = 0; i < V; i++)
for (int j = 0; j < V; j++)
dist[i, j] = graph[i, j];
for (int i = 0; i < V; i++) {
for (int j = 0; j < V; j++) {
for (int k = 0; k < V; k++) {
if (dist[i, k] + dist[k, j] < dist[i, j]) {
dist[i, j] = dist[i, k] + dist[k, j];
}
}
}
}Choose the correct bug:
Solution
Step 1: Analyze loop order
Floyd Warshall requires the outer loop to be over intermediate vertex k, then loops over i and j to update paths through k.Step 2: Identify impact of loop order
Current code loops i, j, then k, which does not correctly consider all intermediate vertices before updating distances, leading to incorrect results.Final Answer:
The order of loops is incorrect; k should be the outer loop -> Option CQuick Check:
Loop order: k outermost for Floyd Warshall [OK]
- Not checking for int.MaxValue before addition
- Incorrect loop nesting order
- Forgetting to initialize dist properly
INF means no direct edge):int INF = int.MaxValue;
int[,] graph = {
{0, 3, INF, 7},
{8, 0, 2, INF},
{5, INF, 0, 1},
{2, INF, INF, 0}
};Using Floyd Warshall, what is the shortest distance from vertex 3 to vertex 1 after the algorithm completes?
Solution
Step 1: Understand the graph and indexing
Vertices are 0-based: vertex 3 means index 3, vertex 1 means index 1. Initial dist[3,1] = INF (no direct edge).Step 2: Apply Floyd Warshall updates to find shortest path from 3 to 1
Check possible paths: - Direct: INF - Via 0: dist[3,0] + dist[0,1] = 2 + 3 = 5 - Via 2: dist[3,2] + dist[2,1] = INF + INF = INF - Other paths do not improve Therefore shortest distance is 5.Final Answer:
5 -> Option AQuick Check:
Shortest path 3->0->1 = 2+3=5 [OK]
- Confusing vertex numbering (0-based vs 1-based)
- Ignoring indirect paths through intermediate vertices
- Assuming direct edge must exist
Ready to prove it?
Pass the test and this pattern moves unknown
