【博客】最短路径算法
Floyd
时间复杂度\(O(n^3)\) 空间复杂度\(O(n^2)\)
可求出每对节点间的最短路
事实上,floyd是基于动态规划实现的
设\(f[k][i][j]\)表示经过前\(k\)个节点,从\(i\)到\(j\)的最短路径
可得\(f[k][x][y] = min(f[k-1][x][y], f[k-1][x][k]+f[k-1][k][y])\)
其中\(f[k-1][x][y]\)为不经过\(k\)点的最短路径
而 \(f[k-1][x][k]+f[k-1][k][y]\),为经过了 k 点的最短路)
然后把第一维优化掉
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int n;
int a[maxn][maxn];
int main() {
for (int k = 0; k < n; k++) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
a[i][j] = min(a[i][j], a[i][k] + a[k][j]);
}
}
}
return 0;
}