Floyd的关键是三重循环和松弛式d[i][j] = min(d[i][j], d[i][k] + d[k][j]),代码和注释如下所示:
#include
using namespace std;
const int INF = 1000000000;
const int n = 5;
// 邻接矩阵
int d[][n] = {
{ 0, 2, INF, 1, 8},
{ 6, 0, 3, 2, INF},
{INF, INF, 0, 4, INF},
{INF, INF, 2, 0, 3},
{ 3, INF, INF, INF, 0}
};
int main()
{
// floyd
for(int k = 0; k < n; ++k)
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
// 输出结果
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
if(j > 0) printf(" ");
if(d[i][j] == INF) printf("INF");
else printf("%3d", d[i][j]);
}
puts("");
}
return 0;
}
运行结果图: