用你熟悉的语言实现Floyd算法,对于具有下面权重矩阵的有向图求解完全最短路径,截图给出运行结果

2025-03-06 02:51:09
推荐回答(1个)
回答1:

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;
}

运行结果图: