Bird
Raised Fist0
DSA C#programming

Floyd Warshall All Pairs Shortest Path in DSA C#

Choose your learning style10 modes available
Mental Model
We find the shortest paths between every pair of points by checking if going through a middle point is shorter than the direct path.
Analogy: Imagine you want to travel between every pair of cities. Sometimes, going through a third city is faster than going directly. We check all cities as possible middle stops to find the quickest routes.
   [0] -> [1] -> [2]
    ↑      ↑      ↑
   dist matrix with direct distances or infinity if no direct path
Dry Run Walkthrough
Input: Graph with 3 nodes and edges: 0->1 (4), 0->2 (11), 1->2 (2)
Goal: Find shortest distances between all pairs of nodes
Step 1: Initialize distance matrix with direct edges and 0 for same nodes
[0, 4, 11]
[∞, 0, 2]
[∞, ∞, 0]
Why: We start with known direct distances and zero for self to self
Step 2: Use node 0 as intermediate to update distances
[0, 4, 11]
[∞, 0, 2]
[∞, ∞, 0]
Why: No shorter paths found through node 0
Step 3: Use node 1 as intermediate to update distances
[0, 4, 6]
[∞, 0, 2]
[∞, ∞, 0]
Why: Distance from 0 to 2 updated from 11 to 6 via node 1 (4 + 2)
Step 4: Use node 2 as intermediate to update distances
[0, 4, 6]
[∞, 0, 2]
[∞, ∞, 0]
Why: No shorter paths found through node 2
Result:
[0, 4, 6]
[∞, 0, 2]
[∞, ∞, 0]
Shortest distances between all pairs found
Annotated Code
DSA C#
using System;

class FloydWarshall {
    const int INF = 99999;

    public static void FloydWarshallAlgorithm(int[,] graph, int V) {
        int[,] dist = new int[V, V];

        // Initialize distance matrix same as input graph
        for (int i = 0; i < V; i++) {
            for (int j = 0; j < V; j++) {
                dist[i, j] = graph[i, j];
            }
        }

        // Update distances considering each node as intermediate
        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] != INF && dist[k, j] != INF && dist[i, k] + dist[k, j] < dist[i, j]) {
                        dist[i, j] = dist[i, k] + dist[k, j];
                    }
                }
            }
        }

        // Print the shortest distance matrix
        for (int i = 0; i < V; i++) {
            for (int j = 0; j < V; j++) {
                if (dist[i, j] == INF) {
                    Console.Write("INF ");
                } else {
                    Console.Write(dist[i, j] + " ");
                }
            }
            Console.WriteLine();
        }
    }

    static void Main() {
        int V = 3;
        int INF = 99999;
        int[,] graph = {
            {0, 4, 11},
            {INF, 0, 2},
            {INF, INF, 0}
        };

        FloydWarshallAlgorithm(graph, V);
    }
}
dist[i, j] = graph[i, j];
copy initial direct distances into dist matrix
if (dist[i, k] != INF && dist[k, j] != INF && dist[i, k] + dist[k, j] < dist[i, j]) {
check if path through k is shorter than current dist[i,j]
dist[i, j] = dist[i, k] + dist[k, j];
update dist[i,j] to shorter path via k
OutputSuccess
0 4 6 INF 0 2 INF INF 0
Complexity Analysis
Time: O(V^3) because we check all pairs (i,j) for every intermediate node k
Space: O(V^2) because we store distances between all pairs in a matrix
vs Alternative: Compared to running Dijkstra from each node (O(V * (V^2)) for dense graphs), Floyd Warshall is simpler but slower for large graphs
Edge Cases
Graph with no edges except self loops
Distances remain zero for same nodes and infinity for others
DSA C#
dist[i, j] = graph[i, j];
Graph with negative edge weights but no negative cycles
Algorithm correctly finds shortest paths including negative edges
DSA C#
if (dist[i, k] != INF && dist[k, j] != INF && dist[i, k] + dist[k, j] < dist[i, j]) {
Graph with negative cycle
Algorithm does not detect negative cycles; distances may become incorrect
DSA C#
No explicit guard; Floyd Warshall needs extension to detect negative cycles
When to Use This Pattern
When asked to find shortest paths between all pairs of points in a graph, especially with possible negative edges, use Floyd Warshall because it systematically checks all intermediate nodes.
Common Mistakes
Mistake: Not initializing distance matrix correctly with direct edges and infinity for no direct path
Fix: Initialize dist matrix by copying graph and setting infinity where no direct edge exists
Mistake: Updating distances without checking if intermediate paths exist (infinity checks missing)
Fix: Add checks to ensure dist[i,k] and dist[k,j] are not infinity before adding
Summary
Finds shortest paths between every pair of nodes in a graph.
Use when you need all pairs shortest paths and graph may have negative edges but no negative cycles.
The key insight is checking if going through an intermediate node shortens the path between two nodes.

Practice

(1/5)
1. What is the main purpose of the Floyd Warshall algorithm in graph theory?
easy
A. To perform a depth-first search traversal
B. To find the minimum spanning tree of a graph
C. To detect cycles in a graph
D. To find the shortest paths between all pairs of vertices in a weighted graph

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    To find the shortest paths between all pairs of vertices in a weighted graph -> Option D
  4. Quick Check:

    Floyd Warshall = All pairs shortest paths [OK]
Hint: Floyd Warshall finds shortest paths between all vertex pairs [OK]
Common Mistakes:
  • Confusing with minimum spanning tree algorithms
  • Thinking it only finds shortest path from one source
  • Assuming it works with negative cycles
2. Which of the following is the correct way to initialize the distance matrix dist for Floyd Warshall in C# when given an adjacency matrix graph of size V?
easy
A. for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { dist[i, j] = graph[i, j]; } }
B. 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; } }
C. for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { dist[i, j] = 0; } }
D. for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { dist[i, j] = -1; } }"

Solution

  1. Step 1: Understand initialization for Floyd Warshall

    The distance matrix dist should start as a copy of the adjacency matrix graph because it holds initial edge weights or infinity where no edge exists.
  2. 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]; } } copies graph to dist, 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.
  3. Final Answer:

    for (int i = 0; i < V; i++) { for (int j = 0; j < V; j++) { dist[i, j] = graph[i, j]; } } -> Option A
  4. Quick Check:

    Initialize dist as graph copy [OK]
Hint: Copy graph matrix to dist for Floyd Warshall start [OK]
Common Mistakes:
  • Setting all distances to zero
  • Not copying actual edge weights
  • Using -1 instead of infinity for no edge
3. Consider the following C# code snippet implementing Floyd Warshall on a graph with 3 vertices and adjacency matrix:
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?
medium
A. 0 5 20 50 0 15 30 INF 0
B. 0 5 20 45 0 15 30 35 0
C. 0 5 INF 50 0 15 30 INF 0
D. 0 5 15 50 0 15 30 35 0

Solution

  1. Step 1: Initialize dist matrix

    dist starts as: 0 5 INF 50 0 15 30 INF 0
  2. Step 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 0
  3. Final Answer:

    0 5 20 45 0 15 30 35 0 -> Option B
  4. Quick Check:

    Floyd Warshall updates shortest paths correctly [OK]
Hint: Check all intermediate vertices k for shorter paths [OK]
Common Mistakes:
  • Not updating dist when shorter path found
  • Confusing INF with int.MaxValue in output
  • Missing updates for indirect paths
4. The following C# code attempts to implement Floyd Warshall but produces incorrect results. What is the main bug?
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:
medium
A. The condition does not check for int.MaxValue before addition
B. The initialization of dist is missing
C. The order of loops is incorrect; k should be the outer loop
D. The code uses wrong indices in the if condition

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    The order of loops is incorrect; k should be the outer loop -> Option C
  4. Quick Check:

    Loop order: k outermost for Floyd Warshall [OK]
Hint: Outer loop must be intermediate vertex k [OK]
Common Mistakes:
  • Not checking for int.MaxValue before addition
  • Incorrect loop nesting order
  • Forgetting to initialize dist properly
5. You have a weighted directed graph with 4 vertices and the following adjacency matrix (where 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?
hard
A. 5
B. 7
C. 6
D. 3

Solution

  1. 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).
  2. 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.
  3. Final Answer:

    5 -> Option A
  4. Quick Check:

    Shortest path 3->0->1 = 2+3=5 [OK]
Hint: Trace paths through intermediate vertices to find shortest distance [OK]
Common Mistakes:
  • Confusing vertex numbering (0-based vs 1-based)
  • Ignoring indirect paths through intermediate vertices
  • Assuming direct edge must exist
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