首页 > 其他 > 详细

Floyd 求最短路

时间:2020-06-07 15:58:49      阅读:51      评论:0      收藏:0      [点我收藏+]

算法思想:https://www.bilibili.com/video/BV1Ut41197NX?t=715

 

一,比较

Dijkstra : 是一种解决单源最短路径的算法,即 固定一点到 余下所有点的最短路径

当若 我们要求所有点之间的最短路径呢?

一个方法是:将 Dij 用 n 次,不过这个时间复杂度一下子就到 n的3次方

于是,有人想出了 Floyd 想出了 Floyd算法 

Floyd: 解决所有顶点间的最短路径

 

二,步骤

1,初始化

用 邻接矩阵 ,对角线全为 0

若存在 <vi,vj>, 则为其权值,否则为 无穷大

 

 2,试探

试着在所有路径中,加入中间顶点 Vx,

若路径变小,则改邻接矩阵的值;否则不变

 

3,循环

试探完所有顶点,算法结束

 

三,例题

技术分享图片

 

 

 

四,代码

技术分享图片
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MIN(x,y) (((x)<(y))?(x):(y))
#define inf 0x3f3f3f3f
#define N 105
int a[N][N];
int n;
void show()
{
    puts("");
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            printf("%d ", a[i][j]);
        }puts("");
    }
}
int main(void)
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)   //1,初始化    用 邻接矩阵 ,对角线全为 0   若存在 <vi, vj>, 则为其权值,否则为 无穷大
    {
        for (int j = 1; j <= n; j++)
            a[i][j] = inf;
        a[i][i] = 0;
    }

    int m; scanf("%d", &m);     // 边数
    while (m--)
    {
        int x, y, w;
        scanf("%d%d%d", &x, &y, &w);
        a[x][y] = w;
    }

    for (int k = 1; k <= n; k++)  // 3,循环  试探完所有顶点,算法结束
    {
        for (int i = 1; i <= n; i++)     // 2,试探     试着在所有路径中,加入中间顶点 Vx , 若路径变小,则改邻接矩阵的值;否则不变
        {
            for (int j = 1; j <= n; j++)
            {
                a[i][j] = MIN(a[i][j], a[i][k] + a[k][j]);
            }
        }
    }
    show();
    
    system("pause");
    return 0;
}/*
3 5
1 2 4
2 1 6
1 3 11
3 1 3
2 3 2
 */
View Code

 

注意:这里没有存路径

这里的测试数据是上面那个例题。

 

 

 

=========== ======== ========= ======= ====== ===== ==== === == =

If there‘s any kind of magic in the world, it must be the attempt of understanding someone or share something.

                                            —Before Sunrise

其实最让我们挣扎、绝望的不是困难,而是身边没有一个值得相信的朋友,能让我敞开心扉跟他分享!

 

Floyd 求最短路

原文:https://www.cnblogs.com/asdfknjhu/p/13060731.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!