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;
}