The Floyd Warshall Algorithm is for solving all pairs of shortest-path problems. The problem is to find the shortest distances between every pair of vertices in a given edge-weighted directed Graph.
It is an algorithm for finding the shortest path between all the pairs of vertices in a weighted graph. This algorithm follows the dynamic programming approach to find the shortest path.
A C-function for a N x N graph is given below. The function stores the all pair shortest path in the matrix cost [N][N]. The cost matrix of the given graph is available in cost Mat [N][N].
Example:
Input: graph[][] = { {0, 5, INF, 10},
{INF, 0, 3, INF},
{INF, INF, 0, 1},
{INF, INF, INF, 0} }
which represents the following graph
10
(0)——->(3)
| /|\
5 | | 1
| |
\|/ |
(1)——->(2)
3
Output: Shortest distance matrix
0 5 8 9
INF 0 3 4
INF INF 0 1
INF INF INF 0
Floyd Warshall Algorithm:
# define N 4
void floydwarshall()
{
int cost [N][N];
int i, j, k;
for(i=0; i<N; i++)
for(j=0; j<N; j++)
cost [i][j]= cost Mat [i] [i];
for(k=0; k<N; k++)
{
for(i=0; i<N; i++)
for(j=0; j<N; j++)
if(cost [i][j]> cost [i] [k] + cost [k][j];
cost [i][j]=cost [i] [k]+'cost [k] [i]:
}
//display the matrix cost [N] [N]
}
- Initialize the solution matrix same as the input graph matrix as a first step.
- Then update the solution matrix by considering all vertices as an intermediate vertex.
- The idea is to one by one pick all vertices and updates all shortest paths which include the picked vertex as an intermediate vertex in the shortest path.
- When we pick vertex number k as an intermediate vertex, we already have considered vertices {0, 1, 2, .. k-1} as intermediate vertices.
- For every pair (i, j) of the source and destination vertices respectively, there are two possible cases.
- k is not an intermediate vertex in shortest path from i to j. We keep the value of dist[i][j] as it is.
- k is an intermediate vertex in shortest path from i to j. We update the value of dist[i][j] as dist[i][k] + dist[k][j] if dist[i][j] > dist[i][k] + dist[k][j]
The following figure shows the above optimal substructure property in the all-pairs shortest path problem.

Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define V 4
#define INF 99999
void printSolution( int dist[][V]);
void floydWarshall( int dist[][V])
{
int i, j, k;
for (k = 0; k < V; k++) {
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
if (dist[i][j] > (dist[i][k] + dist[k][j])
&& (dist[k][j] != INF
&& dist[i][k] != INF))
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
printSolution(dist);
}
void printSolution( int dist[][V])
{
cout << "The following matrix shows the shortest "
"distances"
" between every pair of vertices \n" ;
for ( int i = 0; i < V; i++) {
for ( int j = 0; j < V; j++) {
if (dist[i][j] == INF)
cout << "INF"
<< " " ;
else
cout << dist[i][j] << " " ;
}
cout << endl;
}
}
int main()
{
int graph[V][V] = { { 0, 5, INF, 10 },
{ INF, 0, 3, INF },
{ INF, INF, 0, 1 },
{ INF, INF, INF, 0 } };
floydWarshall(graph);
return 0;
}
|
C
#include <stdio.h>
#define V 4
#define INF 99999
void printSolution( int dist[][V]);
void floydWarshall( int dist[][V])
{
int i, j, k;
for (k = 0; k < V; k++) {
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j])
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
printSolution(dist);
}
void printSolution( int dist[][V])
{
printf (
"The following matrix shows the shortest distances"
" between every pair of vertices \n" );
for ( int i = 0; i < V; i++) {
for ( int j = 0; j < V; j++) {
if (dist[i][j] == INF)
printf ( "%7s" , "INF" );
else
printf ( "%7d" , dist[i][j]);
}
printf ( "\n" );
}
}
int main()
{
int graph[V][V] = { { 0, 5, INF, 10 },
{ INF, 0, 3, INF },
{ INF, INF, 0, 1 },
{ INF, INF, INF, 0 } };
floydWarshall(graph);
return 0;
}
|
Java
import java.io.*;
import java.lang.*;
import java.util.*;
class AllPairShortestPath {
final static int INF = 99999 , V = 4 ;
void floydWarshall( int dist[][])
{
int i, j, k;
for (k = 0 ; k < V; k++) {
for (i = 0 ; i < V; i++) {
for (j = 0 ; j < V; j++) {
if (dist[i][k] + dist[k][j]
< dist[i][j])
dist[i][j]
= dist[i][k] + dist[k][j];
}
}
}
printSolution(dist);
}
void printSolution( int dist[][])
{
System.out.println(
"The following matrix shows the shortest "
+ "distances between every pair of vertices" );
for ( int i = 0 ; i < V; ++i) {
for ( int j = 0 ; j < V; ++j) {
if (dist[i][j] == INF)
System.out.print( "INF " );
else
System.out.print(dist[i][j] + " " );
}
System.out.println();
}
}
public static void main(String[] args)
{
int graph[][] = { { 0 , 5 , INF, 10 },
{ INF, 0 , 3 , INF },
{ INF, INF, 0 , 1 },
{ INF, INF, INF, 0 } };
AllPairShortestPath a = new AllPairShortestPath();
a.floydWarshall(graph);
}
}
|
Python3
V = 4
INF = 99999
def floydWarshall(graph):
dist = list ( map ( lambda i: list ( map ( lambda j: j, i)), graph))
for k in range (V):
for i in range (V):
for j in range (V):
dist[i][j] = min (dist[i][j],
dist[i][k] + dist[k][j]
)
printSolution(dist)
def printSolution(dist):
print ("Following matrix shows the shortest distances\
between every pair of vertices")
for i in range (V):
for j in range (V):
if (dist[i][j] = = INF):
print ( "%7s" % ( "INF" ), end = " " )
else :
print ( "%7d\t" % (dist[i][j]), end = ' ' )
if j = = V - 1 :
print ()
if __name__ = = "__main__" :
graph = [[ 0 , 5 , INF, 10 ],
[INF, 0 , 3 , INF],
[INF, INF, 0 , 1 ],
[INF, INF, INF, 0 ]
]
floydWarshall(graph)
|
C#
using System;
public class AllPairShortestPath {
readonly static int INF = 99999, V = 4;
void floydWarshall( int [, ] graph)
{
int [, ] dist = new int [V, V];
int i, j, k;
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
dist[i, j] = graph[i, j];
}
}
for (k = 0; k < V; k++) {
for (i = 0; i < V; i++) {
for (j = 0; j < V; j++) {
if (dist[i, k] + dist[k, j]
< dist[i, j]) {
dist[i, j]
= dist[i, k] + dist[k, j];
}
}
}
}
printSolution(dist);
}
void printSolution( int [, ] dist)
{
Console.WriteLine(
"Following matrix shows the shortest "
+ "distances between every pair of vertices" );
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();
}
}
public static void Main( string [] args)
{
int [, ] graph = { { 0, 5, INF, 10 },
{ INF, 0, 3, INF },
{ INF, INF, 0, 1 },
{ INF, INF, INF, 0 } };
AllPairShortestPath a = new AllPairShortestPath();
a.floydWarshall(graph);
}
}
|
PHP
<?php
function floydWarshall ( $graph , $V , $INF )
{
$dist = array ( array (0,0,0,0),
array (0,0,0,0),
array (0,0,0,0),
array (0,0,0,0));
for ( $i = 0; $i < $V ; $i ++)
for ( $j = 0; $j < $V ; $j ++)
$dist [ $i ][ $j ] = $graph [ $i ][ $j ];
for ( $k = 0; $k < $V ; $k ++)
{
for ( $i = 0; $i < $V ; $i ++)
{
for ( $j = 0; $j < $V ; $j ++)
{
if ( $dist [ $i ][ $k ] + $dist [ $k ][ $j ] <
$dist [ $i ][ $j ])
$dist [ $i ][ $j ] = $dist [ $i ][ $k ] +
$dist [ $k ][ $j ];
}
}
}
printSolution( $dist , $V , $INF );
}
function printSolution( $dist , $V , $INF )
{
echo "The following matrix shows the " .
"shortest distances between " .
"every pair of vertices \n" ;
for ( $i = 0; $i < $V ; $i ++)
{
for ( $j = 0; $j < $V ; $j ++)
{
if ( $dist [ $i ][ $j ] == $INF )
echo "INF " ;
else
echo $dist [ $i ][ $j ], " " ;
}
echo "\n" ;
}
}
$V = 4 ;
$INF = 99999 ;
$graph = array ( array (0, 5, $INF , 10),
array ( $INF , 0, 3, $INF ),
array ( $INF , $INF , 0, 1),
array ( $INF , $INF , $INF , 0));
floydWarshall( $graph , $V , $INF );
?>
|
Javascript
var INF = 99999;
class AllPairShortestPath {
constructor() {
this .V = 4;
}
floydWarshall(graph) {
var dist = Array.from(Array( this .V), () => new Array( this .V).fill(0));
var i, j, k;
for (i = 0; i < this .V; i++) {
for (j = 0; j < this .V; j++) {
dist[i][j] = graph[i][j];
}
}
for (k = 0; k < this .V; k++) {
for (i = 0; i < this .V; i++) {
for (j = 0; j < this .V; j++) {
if (dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
}
}
}
this .printSolution(dist);
}
printSolution(dist) {
document.write(
"Following matrix shows the shortest " +
"distances between every pair of vertices<br>"
);
for ( var i = 0; i < this .V; ++i) {
for ( var j = 0; j < this .V; ++j) {
if (dist[i][j] == INF) {
document.write( " INF " );
} else {
document.write( " " + dist[i][j] + " " );
}
}
document.write( "<br>" );
}
}
}
var graph = [
[0, 5, INF, 10],
[INF, 0, 3, INF],
[INF, INF, 0, 1],
[INF, INF, INF, 0],
];
var a = new AllPairShortestPath();
a.floydWarshall(graph);
|
OutputThe following matrix shows the shortest distances between every pair of vertices
0 5 8 9
INF 0 3 4
INF INF 0 1
INF INF INF 0
Time Complexity: O(V3)
Auxiliary Space: O(1)
The above program only prints the shortest distances. We can modify the solution to print the shortest paths also by storing the predecessor information in a separate 2D matrix.
Also, the value of INF can be taken as INT_MAX from limits.h to make sure that we handle the maximum possible value. When we take INF as INT_MAX, we need to change the if condition in the above program to avoid arithmetic overflow.
C++
#include
#define INF INT_MAX
.......................... 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];
...........................
|
Java
final int INF = Integer.MAX_VALUE;
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];
}
|
Python3
if dist[i][k] ! = numeric_limits. max () and dist[k][j] ! = numeric_limits. max () and dist[i][k] + dist[k][j] < dist[i][j]:
dist[i][j] = dist[i][k] + dist[k][j]
|
C#
using System;
const int INF = int .MaxValue;
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];
}
|
Javascript
if (dist[i][k] !== Number.MAX_SAFE_INTEGER && dist[k][j] !== Number.MAX_SAFE_INTEGER && dist[i][k] + dist[k][j] < dist[i][j]) {
dist[i][j] = dist[i][k] + dist[k][j];
}
|
Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above