Floyd算法(Floyd-Warshall)
Floyd算法用来找出一个图中任何两个点的最短路径,复杂度为O(n¬3),大体思路为通过考虑i点到j点的当前最短距离dij与i点到k点的最短距离加k点到j点的最短距离dik+dkj来进行比较,并不断更新dij来求出图中任意两点的最短路。该算法通常仅在点数少于300时使用,除去可以求除任意两点间最短路外,该算法还可以用来判断图的连通性。
板子
#include<iostream>
#include<string.h>
using namespace std;
const int MAXN = 2e3 + 5;
const int INF = 0x7fffffff;
int d[MAXN][MAXN], n, m;
void floyd() {
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
d[i][j] = min(d[i][j], d[i][k]+d[k][j]);
cout << d[1][n] << '\n';
}
int main(void) {
//n个点,m条边双向边,边权为w,输出1到n的最短路
while(cin >> n >> m) {
if(!(n + m))break;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
d[i][j] = (i == j) ? 0 : INF;
for(int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
d[u][v] = d[v][u] = w;
}
floyd();
}
}