第一篇博客

弗洛伊德算法模板 (Floyd-Warshall算法)

背景:

现有一个单向有向图:

我们用一个n*n邻接矩阵标记为数组a[n+1][n+1]来表示它:a[i][i]都为0

现在我们以地点1为中介点,让地点i通过地点1到达地点j(i->1->j):

用循环表示为:

for (int i = 1; i <= n; i++)
{
    for (int j = 1; j <= n; j++)
    {
        if (d[i][1] != inf && d[1][j] != inf)  // inf = 0x3f3f3f3f
            d[i][j] = min(d[i][j], d[i][1] + d[1][j]);
    }
}

我们再以地点2为中介点(i->2->j)

for (int i = 1; i <= n; i++)
{
    for (int j = 1; j <= n; j++)
    {
        if (d[i][2] != inf && d[2][j] != inf)  // inf = 0x3f3f3f3f 
            d[i][j] = min(d[i][j], d[i][2] + d[2][j]);
    }
}

所以我们以所有点为中介点,就得到了最终的Floyd-Warshall算法:

for (int k = 1; k <= n; k++)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                if (d[i][k] != inf && d[k][j] != inf)  // inf = 0x3f3f3f3f
                    d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
            }
        }
    }

 另外需要注意的是:Floyd-Warshall算法不能解决带有“负权回路”(或者叫“负权环”)的图,因为带有“负权回路”的图没有最短路。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值