Floyd 算法¶
Floyd 算法,使用动态规划来求解所有点对之间的最短路径。
设给定图的顶点集合 和边集合 ,定义函数 ,表示只允许经过顶点 ,顶点 到顶点 的最短路径长度( 和 不一定在 中)。
当 时,
当 时,
当 时, 就是顶点 到顶点 的最短路径长度。
实现¶
/**
* Floyd's algorithm.
*
* @param graph graph[u][v] is the length of the edge from u to v or {@code -1} if there is no edge.
*/
int[][] floyd(int[][] graph) {
int n = graph.length;
int[][] dp = new int[n][n];
for (int u = 0; u < n; u++) {
for (int v = 0; v < n; v++) {
dp[u][v] = graph[u][v];
}
}
for (int k = 1; k < n; k++) {
for (int u = 0; u < n; u++) {
for (int v = 0; v < n; v++) {
if (dp[u][k] == -1 || dp[k][v] == -1) {
continue;
}
if (dp[u][v] == -1) {
dp[u][v] = dp[u][k] + dp[k][v];
} else {
dp[u][v] = Math.min(dp[u][v], dp[u][k] + dp[k][v]);
}
}
}
}
return dp;
}
算法的时间复杂度为 。