末世苍雪

root@jtahstu.com   Github  

最新碎语:这个M1 MBP, PHP多版本环境装的我极度崩溃, 历时4个小时终于搞定了. 1. brew转不了7.x的环境, 默认只能装8.1, 恶心. 2. Nginx装上了, 但是请求转发不到php-fpm上, 试了各种配置都不行, 删掉Nginx转战Apache, 吐了. 3. 系统自带httpd, brew能装上httpd但搞死启动不了httpd, 只能手动启动和关闭httpd, 无语. 4. 以上问题都解决后, 加上自己写的启动和关闭脚本, 目前能正常跑起来PHP文件了, 开心! 为啥目前没有开源好用的M1 MNMP环境哇, o(≧口≦)o

您的位置:末世苍雪 >算法> 最简单的最短路径算法 - Floyd_Warshall算法

最简单的最短路径算法 - Floyd_Warshall算法

最简单的最短路径算法 - Floyd_Warshall算法

算法


参考《啊哈算法》第六章第一节,PDF在线阅读

介绍

详细介绍请看PDF,个人理解,这是一个暴力+动态规划的思想,在二维数组中每次都从第1,2,3 ... N节点中转一次,如果可以中转且路径较小,那么我们就更新存储路径的二维数组。

这个算法可以解决多源最短路径问题

时间复杂度 O(N^3)

代码

/**
 * 多源最短路径
 * Floyd_Warshall算法
 * 时间复杂度 O(N^3)
 */

#include <iostream>
#include <climits>

using namespace std;

int n;

void print(int e[10][10]) {
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            printf("%15d", e[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}

int main() {
    int e[10][10] = {0}, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (i == j)
                e[i][j] = 0;
            else
                e[i][j] = INT_MAX;
    int a, b, c;
    for (int i = 1; i <= m; i++) {
        cin >> a >> b >> c;
        e[a][b] = c;
    }

    for (int k = 1; k <= n; k++) { //让二维数组依次从k点中转一下
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++) {
                //可以中转取较小值,无法到达就跳过
                if (e[i][j] > e[i][k] + e[k][j] && e[i][k] != INT_MAX && e[k][j] != INT_MAX)
                    e[i][j] = e[i][k] + e[k][j];
            }
//        print(e);
    }

    print(e);

    return 0;
}

/**
5 8
1 3 2
1 5 4
2 5 2
3 4 3
4 2 5
5 2 5
5 3 3
5 4 1
              0              9              2              5              4
     2147483647              0              5              3              2
     2147483647              8              0              3             10
     2147483647              5             10              0              7
     2147483647              5              3              1              0

4 8
1 2 2
1 3 6
1 4 4
2 3 3
3 1 7
3 4 1
4 1 5
4 3 12
         0         2         5         4
         9         0         3         4
         6         8         0         1
         5         7        10         0
 */


---

本文章采用 知识共享署名2.5中国大陆许可协议 进行许可,转载必须注明作者和本文链接。

---

二维码加载中...

扫一扫移动端访问O(∩_∩)O

发表评论

58 + 41 =
路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交
正在加载中……