The Floyd-Warshall Algorithm is an algorithm that computes the length of the shortest path between every pair of vertices in a directed graph with edge weights and no negative cycles in time and space.
Tip
This problem can also be solved by the Bellman-Ford Algorithm in time and space.
Tip
This problem can also be solved by Johnson’s Algorithm in
time and space, or
time and space.
Algorithm 0
Lemma
Let , and let denote the length of the shortest path from to that only passes through (excluding the endpoints) vertices . Then
Applying the lemma to find yields an algorithm that solves the problem in time and space.
std::vector<std::vector<int>> floyd_warshall(int n, int m, const std::vector<int> &u, const std::vector<int> &v, const std::vector<int> &w) {
std::vector dist(n + 1, std::vector(n, std::vector(n, inf)));
for (int i = 0; i < m; i++) {
dist[0][u[i]][v[i]] = std::min(dist[0][u[i]][v[i]], w[i]);
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dist[k + 1][i][j] = std::min(dist[k][i][j], dist[k][i][k] + dist[k][k][j]);
}
}
}
return dist[n];
}Algorithm 1
Lemma
Based on Algorithm 0, applying the lemma yields that the first dimension can be ignored.
Ignoring the first dimension yields an algorithm that solves the problem in time and space.
std::vector<std::vector<int>> floyd_warshall(int n, int m, const std::vector<int> &u, const std::vector<int> &v, const std::vector<int> &w) {
std::vector dist(n, std::vector(n, inf));
for (int i = 0; i < m; i++) {
dist[u[i]][v[i]] = std::min(dist[u[i]][v[i]], w[i]);
}
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
dist[i][j] = std::min(dist[i][j], dist[i][k] + dist[k][j]);
}
}
}
return dist;
}