Floyd-Warshall — All-Pairs Shortest Path

Sanjeev SharmaSanjeev Sharma
2 min read

Advertisement

Algorithm

For each intermediate vertex k, relax all pairs (i,j):

dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])

Initialise: dist[i][i]=0, dist[i][j]=edge weight or .

After: dist[i][i] < 0 means negative cycle reachable from i.


Solutions

Python

import math

def floyd_warshall(n, edges):
    dist = [[math.inf]*n for _ in range(n)]
    for i in range(n): dist[i][i] = 0
    for u, v, w in edges:
        dist[u][v] = min(dist[u][v], w)

    for k in range(n):
        for i in range(n):
            for j in range(n):
                if dist[i][k] + dist[k][j] < dist[i][j]:
                    dist[i][j] = dist[i][k] + dist[k][j]
    return dist

JavaScript

function floydWarshall(n, edges) {
    const dist=Array.from({length:n},(_,i)=>Array.from({length:n},(_,j)=>i===j?0:Infinity));
    for(const[u,v,w]of edges)dist[u][v]=Math.min(dist[u][v],w);
    for(let k=0;k<n;k++)for(let i=0;i<n;i++)for(let j=0;j<n;j++)
        if(dist[i][k]+dist[k][j]<dist[i][j])dist[i][j]=dist[i][k]+dist[k][j];
    return dist;
}

Java

public int[][] floydWarshall(int n, int[][] edges) {
    int INF=Integer.MAX_VALUE/2;
    int[][] d=new int[n][n];
    for(int[]r:d)java.util.Arrays.fill(r,INF);
    for(int i=0;i<n;i++)d[i][i]=0;
    for(int[]e:edges)d[e[0]][e[1]]=Math.min(d[e[0]][e[1]],e[2]);
    for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)
        if(d[i][k]<INF&&d[k][j]<INF)d[i][j]=Math.min(d[i][j],d[i][k]+d[k][j]);
    return d;
}

C++

#include <vector>
#include <climits>
using namespace std;
vector<vector<int>> floydWarshall(int n, vector<array<int,3>>& edges){
    const int INF=1e9;
    vector<vector<int>> d(n,vector<int>(n,INF));
    for(int i=0;i<n;i++)d[i][i]=0;
    for(auto&e:edges)d[e[0]][e[1]]=min(d[e[0]][e[1]],e[2]);
    for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)
        if(d[i][k]<INF&&d[k][j]<INF)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
    return d;
}

C

#define INF 1000000000
void floydWarshall(int d[][100],int n){
    for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)
        if(d[i][k]<INF&&d[k][j]<INF&&d[i][k]+d[k][j]<d[i][j])d[i][j]=d[i][k]+d[k][j];
}

Complexity

TimeSpace
Floyd-WarshallO(V³)O(V²)
Dijkstra × VO(V·E log V)O(V²)

Use Floyd-Warshall when V ≤ 500 and you need all pairs.

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro