Floyd
如果你有挑战程序设计竞赛第二版(群文件里面有PDF版本),你可以看P103讲解的很好。
如果要用到 Floyd 算法建边方式基本都是邻接矩阵,因为时间复杂度为O(n^3),所以说n通常都不会很大。
Floyd 可以求解多源最短路,传递闭包(POJ3660),求最小环。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 105;
const int INF = 0x3f3f3f3f;
int dis[maxn][maxn];
///dis[i][j]表示 i到j的最短距离
void init() {
for (int i = 1; i < maxn; i++) {
for (int j = 1; j < maxn; j++)
dis[i][j] = INF;
dis[i][i] = 0;
}
}
int main() {
init();
int n, m, s, e, c;
scanf("%d %d", &n, &m);
while (m--) {
scanf("%d %d %d", &s, &e, &c);
dis[s][e] = min(dis[s][e], c);//可能存在重边
// 无向边 dis[e][s]=min(dis[e][s], c);
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
return 0;
}