Bird
Raised Fist0
DSA C++programming~5 mins

Floyd Warshall All Pairs Shortest Path in DSA C++ - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the main purpose of the Floyd Warshall algorithm?
It finds the shortest paths between all pairs of vertices in a weighted graph, even if some edges have negative weights, as long as there are no negative cycles.
Click to reveal answer
beginner
What is the time complexity of the Floyd Warshall algorithm?
The time complexity is O(V³), where V is the number of vertices in the graph.
Click to reveal answer
intermediate
In Floyd Warshall, what does the matrix entry dist[i][j] represent during the algorithm?
It represents the shortest known distance from vertex i to vertex j considering intermediate vertices up to a certain index k.
Click to reveal answer
intermediate
Why does Floyd Warshall algorithm use three nested loops?
Because it iterates over all pairs of vertices (i, j) and considers each vertex k as an intermediate point to update the shortest path between i and j.
Click to reveal answer
advanced
How does Floyd Warshall detect a negative weight cycle?
If any diagonal element dist[i][i] becomes negative after running the algorithm, it indicates a negative weight cycle reachable from vertex i.
Click to reveal answer
What type of graphs can Floyd Warshall algorithm handle?
AGraphs with negative cycles
BOnly graphs with positive edges
COnly unweighted graphs
DGraphs with negative edges but no negative cycles
What does the Floyd Warshall algorithm update in each iteration?
ANumber of edges in the graph
BOnly shortest path from source to destination
CShortest path distances between all pairs of vertices
DGraph adjacency list
Which data structure is primarily used to store distances in Floyd Warshall?
ALinked list
B2D matrix
CQueue
DStack
What does a negative value in dist[i][i] after the algorithm finishes indicate?
ANegative weight cycle reachable from vertex i
BNo path from i to i
CGraph is disconnected
DAlgorithm failed
What is the main difference between Floyd Warshall and Dijkstra's algorithm?
AFloyd Warshall finds shortest paths between all pairs; Dijkstra finds shortest path from one source
BDijkstra works with negative edges; Floyd Warshall does not
CFloyd Warshall uses a queue; Dijkstra uses a stack
DBoth algorithms are identical
Explain how the Floyd Warshall algorithm updates the shortest path matrix step-by-step.
Think about considering each vertex as an intermediate point.
You got /4 concepts.
    Describe how Floyd Warshall detects negative weight cycles and why this is important.
    Focus on the meaning of dist[i][i] after algorithm completion.
    You got /4 concepts.

      Practice

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

      Solution

      1. Step 1: Understand Floyd Warshall algorithm goal

        The Floyd Warshall algorithm is designed to find shortest paths between every pair of vertices in a weighted graph, including negative weights but no negative cycles.
      2. Step 2: Compare with other graph algorithms

        Minimum spanning tree algorithms find a tree connecting all vertices with minimum total edge weight, cycle detection algorithms find cycles, and DFS is a traversal method. These are different from Floyd Warshall's goal.
      3. Final Answer:

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

        Floyd Warshall = all pairs shortest paths [OK]
      Hint: Floyd Warshall finds shortest paths between all vertex pairs [OK]
      Common Mistakes:
      • Confusing Floyd Warshall with minimum spanning tree algorithms
      • Thinking it only finds shortest path from one source
      • Assuming it detects cycles instead of paths
      2. Which of the following is the correct way to initialize the distance matrix dist for Floyd Warshall in C++ for a graph with n vertices and adjacency matrix graph?
      easy
      A. for (int i = 0; i < n; i++) dist[i] = graph[i];
      B. for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) dist[i][j] = graph[i][j];
      C. dist = graph;
      D. dist = new int[n][n];

      Solution

      1. Step 1: Understand distance matrix initialization

        We need to copy each element from the adjacency matrix graph to dist element-wise because dist is a 2D array and direct assignment is not allowed in C++.
      2. Step 2: Analyze each option

        for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) dist[i][j] = graph[i][j]; uses nested loops to copy each element correctly. for (int i = 0; i < n; i++) dist[i] = graph[i]; tries to assign a row pointer which is invalid for 2D arrays. dist = graph; tries direct assignment which is invalid for arrays. dist = new int[n][n]; only allocates memory but does not initialize values.
      3. Final Answer:

        for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) dist[i][j] = graph[i][j]; -> Option B
      4. Quick Check:

        Element-wise copy needed = for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) dist[i][j] = graph[i][j]; [OK]
      Hint: Use nested loops to copy 2D arrays element-wise [OK]
      Common Mistakes:
      • Trying to assign 2D arrays directly
      • Copying only row pointers instead of elements
      • Not initializing distance matrix before algorithm
      3. What will be the output distance matrix after running Floyd Warshall on the following graph with 3 vertices and adjacency matrix:
      int graph[3][3] = {
        {0, 5, 999},
        {50, 0, 15},
        {30, 999, 0}
      };

      Assuming 999 represents no direct edge.
      medium
      A. [[0, 5, 20], [50, 0, 15], [30, 35, 0]]
      B. [[0, 5, 999], [50, 0, 15], [30, 999, 0]]
      C. [[0, 5, 999], [50, 0, 15], [30, 45, 0]]
      D. [[0, 5, 20], [45, 0, 15], [30, 35, 0]]

      Solution

      1. Step 1: Initialize distance matrix

        Start with dist = graph:
        dist = [[0,5,999],[50,0,15],[30,999,0]]
      2. Step 2: Update distances using Floyd Warshall

        Check if going through vertex 0 improves paths:
        dist[1][2] = min(15, dist[1][0]+dist[0][2]) = min(15, 50+999)=15 (no change)
        dist[2][1] = min(999, dist[2][0]+dist[0][1]) = min(999, 30+5)=35 (updated)
        Check through vertex 1:
        dist[0][2] = min(999, dist[0][1]+dist[1][2]) = min(999, 5+15)=20 (updated)
        dist[2][2] = min(0, dist[2][1]+dist[1][2]) = min(0, 35+15)=0 (no change)
        Check through vertex 2:
        dist[1][0] = min(50, dist[1][2]+dist[2][0]) = min(50, 15+30)=45 (updated)
      3. Final Answer:

        [[0, 5, 20], [45, 0, 15], [30, 35, 0]] -> Option D
      4. Quick Check:

        Updated shortest paths matrix = [[0, 5, 20], [45, 0, 15], [30, 35, 0]] [OK]
      Hint: Check all intermediate vertices to update shortest paths [OK]
      Common Mistakes:
      • Not updating paths through intermediate vertices
      • Confusing no edge (999) with zero
      • Missing updates for reverse paths
      4. Identify the error in this Floyd Warshall code snippet and select the fix:
      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];
          }
        }
      }
      medium
      A. Check if dist[i][k] and dist[k][j] are not infinity before adding
      B. No error; code is correct
      C. Change loop order to i, j, k
      D. Use max instead of min in the if condition

      Solution

      1. Step 1: Understand potential overflow in addition

        If dist[i][k] or dist[k][j] is infinity (representing no path), adding them causes incorrect results or overflow.
      2. Step 2: Fix by checking for infinity before addition

        Before adding dist[i][k] + dist[k][j], ensure both are not infinity to avoid invalid updates.
      3. Final Answer:

        Check if dist[i][k] and dist[k][j] are not infinity before adding -> Option A
      4. Quick Check:

        Prevent invalid addition by checking infinity [OK]
      Hint: Always check for infinity before adding distances [OK]
      Common Mistakes:
      • Ignoring infinity checks causing wrong updates
      • Changing loop order incorrectly
      • Using max instead of min for shortest path
      5. Given a weighted directed graph with 4 vertices and adjacency matrix:
      int graph[4][4] = {
        {0, 3, 999, 7},
        {8, 0, 2, 999},
        {5, 999, 0, 1},
        {2, 999, 999, 0}
      };

      Use Floyd Warshall to find the shortest path distance from vertex 0 to vertex 3 after all updates. What is the shortest distance?
      hard
      A. 8
      B. 7
      C. 6
      D. 9

      Solution

      1. Step 1: Initialize distance matrix

        Start with dist = graph:
        dist = [[0,3,999,7],[8,0,2,999],[5,999,0,1],[2,999,999,0]]
      2. Step 2: Update distances through intermediate vertices

        Check paths through vertex 0:
        dist[1][3] = min(999, dist[1][0]+dist[0][3]) = min(999, 8+7)=15
        dist[2][1] = min(999, dist[2][0]+dist[0][1]) = min(999, 5+3)=8
        dist[3][1] = min(999, dist[3][0]+dist[0][1]) = min(999, 2+3)=5
        Check paths through vertex 1:
        dist[0][2] = min(999, dist[0][1]+dist[1][2]) = min(999, 3+2)=5
        dist[0][3] = min(7, dist[0][1]+dist[1][3]) = min(7, 3+15)=7
        dist[3][2] = min(999, dist[3][1]+dist[1][2]) = min(999, 5+2)=7
        Check paths through vertex 2:
        dist[1][3] = min(15, dist[1][2]+dist[2][3]) = min(15, 2+1)=3 (updated)
        dist[0][3] = min(7, dist[0][2]+dist[2][3]) = min(7, 5+1)=6 (updated)
        Check paths through vertex 3:
        dist[2][0] = min(5, dist[2][3]+dist[3][0]) = min(5, 1+2)=3 (updated)
      3. Final Answer:

        6 -> Option C
      4. Quick Check:

        Shortest path 0 to 3 = 6 [OK]
      Hint: Update distances through all vertices stepwise [OK]
      Common Mistakes:
      • Not updating paths through all intermediate vertices
      • Missing shorter path updates
      • Confusing direct edge with shortest path
      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