基于三重循环动态规划,同屏呈现中介节点 $K$ 遍历、路径图形拟合与 $4 \times 4$ 邻接矩阵动态状态转移
Floyd 算法是解决全源最短路径问题(求解图中任意两点间的最短路径)的经典动态规划算法,能够处理负权边(但不能处理负权回路)。
我们用 dp[i][j] 表示从 $i$ 到 $j$ 的当前已知最短距离。当考虑引入中介节点 $k$ 时:
其物理意义极其直观:从 $i$ 直达 $j$ 的距离,与“先从 $i$ 到中转点 $k$,再从 $k$ 到 $j$”的距离之和,二者取较小值。
| i \ j | 1 | 2 | 3 | 4 |
|---|
void floyd() {
// dp[i][j] 初始填充为邻接矩阵的权值
for (int k = 1; k <= n; k++) { // 1. 中介点放在最外层循环!
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
// 2. 状态转移方程:测试经过中介点 k 是否更优
if (dp[i][k] != INF && dp[k][j] != INF) {
if (dp[i][j] > dp[i][k] + dp[k][j]) {
dp[i][j] = dp[i][k] + dp[k][j]; // 松弛更新
}
}
}
}
}
}