核心代码

for(int k=1; k<=NODE; ++k)//对于每一个中转点for(int i=0; i<=NODE; ++i)//枚举源点for(int j=0; j<=NODE; ++j)//枚举终点if(distmap[i][j]>distmap[i][k]+distmap[k][j])//不满足三角不等式{distmap[i][j]=distmap[i][k]+distmap[k][j];//更新path[i][j]=k;//记录路径}

状态转移方程

其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};
map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。
当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。

时间复杂度与空间复杂度

编辑

时间复杂度:O(n^3);
空间复杂度:O(n^2)[1]

优缺点分析

编辑

Floyd算法适用于APSP(All Pairs Shortest Paths,多源最短路径),是一种动态规划算法,稠密图效果最佳,边权可正可负。此算法简单有效,由于三重循环结构紧凑,对于稠密图,效率要高于执行|V|次Dijkstra算法,也要高于执行V次SPFA算法。
优点:容易理解,可以算出任意两个节点之间的最短距离,代码编写简单。
缺点:时间复杂度比较高,不适合计算大量数据。

算法描述

编辑

a) 初始化:D[u,v]=A[u,v]
b) For k:=1 to n
For i:=1 to n
For j:=1 to n
If D[i,j]>D[i,k]+D[k,j] Then
D[i,j]:=D[i,k]+D[k,j];
c) 算法结束:D即为所有点对的最短路径矩阵

参考代码

编辑

C语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<stdio.h>
#include<stdlib.h>
#define max 1000000000
int d[1000][1000],path[1000][1000];
int main()
{
int i,j,k,m,n;
int x,y,z;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
    d[i][j]=max;
    path[i][j]=j;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
d[x][y]=z;
d[y][x]=z;
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(d[i][k]+d[k][j]<d[i][j]){
    d[i][j]=d[i][k]+d[k][j];
    path[i][j]=path[i][k];
    }
}
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
  if (i!=j) printf("%d->%d:%d\n",i,j,d[i][j]);
int f,en;
scanf("%d%d",&f,&en);
while (f!=en){
    printf("%d->",f);
    f=path[f][en];
}
printf("%d\n",en);
return 0;
}

C++语言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<iostream>
#include<vector>
using namespace std;
const int &INF=100000000;
void floyd(vector<vector<int> > &distmap,//可被更新的邻接矩阵,更新后不能确定原有边
           vector<vector<int> > &path)//路径上到达该点的中转点
//福利:这个函数没有用除INF外的任何全局量,可以直接复制!
{
    const int &NODE=distmap.size();//用邻接矩阵的大小传递顶点个数,减少参数传递
    path.assign(NODE,vector<int>(NODE,-1));//初始化路径数组 
    for(int k=1; k!=NODE; ++k)//对于每一个中转点
        for(int i=0; i!=NODE; ++i)//枚举源点
            for(int j=0; j!=NODE; ++j)//枚举终点
                if(distmap[i][j]>distmap[i][k]+distmap[k][j])//不满足三角不等式
                {
                    distmap[i][j]=distmap[i][k]+distmap[k][j];//更新
                    path[i][j]=k;//记录路径
                }
}
void print(const int &beg,const int &end,
           const vector<vector<int> > &path)//传引用,避免拷贝,不占用内存空间
           //也可以用栈结构先进后出的特性来代替函数递归 
{
    if(path[beg][end]>=0)
    {
        print(beg,path[beg][end],path);
        print(path[beg][end],end,path);
    }
    else cout<<"->"<<end;
}
int main()
{
    int n_num,e_num,beg,end;//含义见下
    cout<<"(不处理负权回路)输入点数、边数:";
    cin>>n_num>>e_num;
    vector<vector<int> > path,
          distmap(n_num,vector<int>(n_num,INF));//默认初始化邻接矩阵
    for(int i=0,p,q; i!=e_num; ++i)
    {
        cout<<"输入第"<<i+1<<"条边的起点、终点、长度(100000000代表无穷大,不联通):";
        cin>>p>>q;
        cin>>distmap[p][q];
    }
    floyd(distmap,path);
    cout<<"计算完毕,可以开始查询,请输入出发点和终点:";
    cin>>beg>>end;
    cout<<"最短距离为"<<distmap[beg][end]<<",打印路径:"<<beg;
    print(beg,end,path);
}

Floyd算法(弗洛伊德算法) 百度百科相关推荐

  1. 别说了,世界那么大我想去看看!(最短路径-迪杰斯特拉算法弗洛伊德算法)

    前言: 一直想去外面的世界看看,中国城市那么多,那么美,怎么样才可以用最少的钱,最短的时间游遍我想去的城市呢?(我在做梦?不不不!迪杰斯特拉算法和弗洛伊德算法来了)      这两个算法有着广泛的用途 ...

  2. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

  3. C++——迪杰斯特拉算法弗洛伊德算法(DijkstraFloyd)for Neuedu

    采用迪杰斯特拉算法和弗洛伊德算法 求出两个景点间的最短路径和最短距离 例如下图所示的无向图: 通过输入节点个数和线路条数,分别输入各线路权值进行计算最短(最优)线路. Ps:使用Qt进行编译运行 /* ...

  4. 最短路径:迪杰斯特拉算法+弗洛伊德算法

    目录 一.迪杰斯特拉算法 1.算法描述 2.C语言代码 二.弗洛伊德算法 1.算法描述 2.C语言代码 一.迪杰斯特拉算法 1.算法描述 迪杰斯特拉算法计算的是网中的一个顶点到其它顶点的最短路径问题. ...

  5. 算法——弗洛伊德算法(Floyd-Warshall)(图论)(c++)

    (蒟蒻的第四篇文章,希望dalao勿喷) (希望没问题) 声明: 1.本人变量定义的名称很low 2.本人用的方法也很low 3.但我觉得文章应该不low (盲目自信) 第四篇文章讲讲Floyd算法 ...

  6. 弗洛伊德算法_弗洛伊德算法

    前面Dijkstra算法和Bellman-Ford算法解决了单源最短路径问题,但是如果需要获取图中任意两顶点的最短距离呢?我们可以使用前面两个算法我们可以遍历每个顶点得到每个顶点的单源最短距离,但是最 ...

  7. 最短路径之迪杰斯特拉(Dijkstra 算法)弗洛伊德算法(C语言完整代码实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  8. Java 图的最短路径问题-迪杰斯特拉算法VS弗洛伊德算法

    1.迪杰斯特拉算法VS弗洛伊德算法 迪杰斯特拉算法通过选定的被访问顶点,求出从出发访问顶点到其他顶点的最短路径: 弗洛伊德算法中每一个顶点都是出发访问点,所以需要将每一个顶点看做被访问顶点,求出从每一 ...

  9. 迪杰斯特拉、弗洛伊德算法

    迪杰斯特拉Dijkstra算法 迪杰斯特拉算法是用来求单源最短路径,即从源点到其他各点的最短距离(边权值不允许有负值) 最短路径问题---Dijkstra算法详解_Ouyang_Lianjun的博客- ...

最新文章

  1. html 弹出遮罩 iframe,iframe正在加载时显示遮罩层 加载完毕后显示iframe
  2. python3 beautifulsoup 表格_[Python3爬虫]Beautiful Soup解析库
  3. 【每日一题】7月20日题目精讲—着色方案
  4. 昔日光伏巨头赛维LDK迎“接盘侠” 平煤系深度整合产业链
  5. 年仅 5 岁的 Rust 如何成为最受欢迎的编程语言?
  6. iptables联系一
  7. 阿里云服务器ECS数据盘的自动挂载解决方案
  8. Flutter PageView简析
  9. boost shared_ptr 用法
  10. Linux中grep命令详解
  11. 汉印HPRT XT130 打印机驱动
  12. 计算机专业是不是天坑专业,工科中的三大“天坑”专业,就业前景不太乐观,入坑需谨慎!...
  13. Meyer Burger获中国客户1800万瑞士法郎光伏设备订单
  14. 光纤中的多种光学模式芯径_单模光纤和多模光纤的区别特点?选择哪个好?
  15. ibm服务器互换硬盘,实战IBM xSeries 346服务器更换硬盘 - 鲜甜IT.Net
  16. SaaS模式、技术与案例详解——第12章 数据存储
  17. Win10 1809 PowerShell美化教程
  18. Harbor: Harbor卸载安装及基本使用教程
  19. sunspot solr
  20. 勤哲Excel服务器分类问题解答

热门文章

  1. 装X时刻!win10/CentOS 7双系统成功安装小白教程
  2. 企业内部专用,企业培训系统源码
  3. 工单系统是什么?工单系统有什么功能?
  4. 组合(Composite)模式
  5. 进位计数制及其转换(二进制、八进制、十进制、十六进制)
  6. Flutter 非空安全包构建(dart>=2.12)
  7. 李某某是一个强迫症患者,他喜欢整整齐齐的东西。比如看到一列数字,他都喜欢在这些数字前面加一些“0“,使得这列数字整齐划一。
  8. 程序员常常看到的英文
  9. 阿里云代理商(聚搜云):这是云计算最好的时代
  10. 01 ,淘宝基本知识,提前准备,推广