为了能讲明白弗洛伊德(Floyd)算法的精妙所在,我们先来看最简单的案例。下图是一个最简单的3个顶点连通网图。

我们先定义两个二维数组D[3][3]和P[3][3],D代表顶点到顶点的最短路径权值和的矩阵。P代表对应顶点的最小路径的前驱矩阵。在未分析任何顶点之前,我们将D命名为,其实它就是初始的图的邻接矩阵。将P命名为,初始化为图中所示的矩阵。

                

首先我们来分析,所有的顶点经过v0后到达另一顶点的最短路径。因为只有三个顶点,因此需要查看v1→v0→v2,得到 [1][0] + [0][2] = 2+1 = 3。[1][2] 表示的是v1→v2的权值为5,我们发现 [1][2] > [1][0] + D1[0][2],通俗的话讲就是v1→v0→v2比直接v1→v2距离还要近。所以我们就让 [1][2] = [1][0] + [0][2] = 3,同样的 [2][1] = 3,于是就有了的矩阵。因为有变化,所以P矩阵对应的 [1][2] 和 [2][1] 也修改为当前中转的顶点v0的下标0,于是就有了。也就是说    ,此时的和 分别是

接下来,其实也就是在的基础上继续处理所有顶点经过v1和v2后到达另一顶点的最短路径,得到完成所有顶点到所有顶点的最短路径计算工作。

现在我们来看一下弗洛伊德(Floyd)算法的具体实现,我们先给出下图所示的网以及它的矩阵:

D代表顶点到顶点的最短路径权值和的矩阵。P代表对应顶点的最小路径的前驱矩阵。

具体实现:

#include<iostream>
#include<vector>
#include<queue>
using namespace std;#define MAXVEX 100//最大顶点数
typedef char VertexType;//顶点类型
typedef int EdgeType;//边上的权值类型
typedef struct
{VertexType vexs[MAXVEX];//顶点表EdgeType arc[MAXVEX][MAXVEX];//邻接矩阵int numVertexte;//当前顶点数int numEdges;//当前边数
}MGraph;void ShortestPath_Floyd(MGraph G, vector<vector<int>>& P, vector<vector<int>>& D)
{for (int i = 0; i < G.numVertexte; ++i){for (int j = 0; j < G.numVertexte; ++j){D[i][j] = G.arc[i][j];//用G的邻接矩阵初始化DP[i][j] = j;}for (int i = 0; i < G.numVertexte; ++i){for (int j = 0; j < G.numVertexte; ++j){for (int w = 0; w < G.numVertexte; ++w){if (D[j][w] > D[j][i] + D[i][w])//如果经过下标为i的顶点路径比原两点间路径更短{D[j][w] = D[j][i] + D[i][w];//更新D的值P[j][w] = P[j][i];//更新P的值}}}}}
}/*我们可以通过下面这个函数将最短路径打印出来*/
void Print(MGraph G, vector<vector<int>>& P, vector<vector<int>>& D)
{for (int i = 0; i < G.numVertexte; ++i){for (int j = i+1; j < G.numVertexte; ++j){printf("v%d-v%d weight:%d ", i, j, D[i][j]);//打印源点 终点  以及他们之前的权int k = P[i][j];//第一个路径顶点下标printf(" path:%d", i);//打印源点while (k != j)//如果没有到终点{printf("-> %d", k);//打印路径顶点k = P[k][j];//获取下一个路径顶点下标}printf(" -> %d\n", j);//打印终点}printf("\n");}
}

最终我们得到的结果如下图所示:

那么如何由P这个路径数组得出具体的最短路径呢?以v0到v8为例,从上图的右图第v8列,P[0][8]=1,得到要经过顶点v1,然后将1取代0得到P[1][8]=2,说明要经过v2,然后将2取代1得到P[2][8]=4,说明要经过V4,然后将4取代2得到P[4][8]=3,说明要经过V3,…,这样很容易就推导出最终的最短路径值为v0→v1->v2→v4->v3->v6->v7->v8。

如果你面临需要求所有顶点至所有顶点的最短路径问题时,弗洛伊德(Floyd)算法应该是不错的选择。时间复杂度为

另外,我们虽然对求最短路径的两个算法举例都是无向图,但它们对有向图依然有效,因为二者的差异仅仅是邻接矩阵是否对称而已。

七、最短路径——弗洛伊德(Floyd)算法相关推荐

  1. 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)

    目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...

  2. 弗洛伊德(Floyd)算法求解图的最短路径

    弗洛伊德(Froyd)算法用于求解所有顶点到所有顶点的的最短路径.时间复杂度为O(n^3). 正如我们所知道的,Floyd算法用于求最短路径.Floyd算法可以说是Warshall算法的扩展,三个fo ...

  3. 060.弗洛伊德(Floyd)算法的原理以及解决最短路径问题

    1. 弗洛伊德(Floyd)算法的原理 1.1. 基本介绍 1.1.1. 弗洛伊德算法和迪杰斯特拉算法比较 1.2. 算法步骤 1.3. 步骤图解 1.3.1. 第一轮循环 1.3.2. 找出每个点作 ...

  4. 算法其实很简单—弗洛伊德(Floyd)算法

    目录 1.弗洛伊德(Floyd)算法介绍 2.弗洛伊德(Floyd)算法最佳应用-最短路径 3.弗洛伊德(Floyd)算法图解分析 3.1 弗洛伊德算法的步骤: 4.代码实现 1.弗洛伊德(Floyd ...

  5. Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法

    1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...

  6. Java实现之弗洛伊德(Floyd)算法

    一.问题引入 1.问题引入 1)胜利乡有7个村庄(A,B,C,D,E,F, G) 2)各个村庄的距离用边线表示(权),比如A-B距离5公里3)问:如何计算出各村庄到其它各村庄的最短距离? 二.基本介绍 ...

  7. 计算完全最短路径的Floyd算法

    [计算完全最短路径的Floyd算法] (一).定义** Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APS ...

  8. 图的所有顶点间的最短路径(Floyd算法)

    问题描述 对每一对顶点vi ≠ vj,求出vi与vj之间的最短路径和最短路径长度 Floyd算法 Floyd(Floyd-Warshall)算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中 ...

  9. 最短路径问题---Floyd算法详解

    前言 Genius only means hard-working all one's life. Name:Willam Time:2017/3/8 1.最短路径问题介绍 问题解释: 从图中的某个顶 ...

  10. 最短路径弗洛伊德Floyd(超详细)

    前一篇最短路径使用dijkstra算法可以求得单一源点到其余各点的最短路径.如果要求任意两点间的最短路径,则需要用到弗洛伊德算法(Floyd). 假设有向图G=(V,E)采用邻接矩阵cost存储,另外 ...

最新文章

  1. java面试题2019 答案
  2. Php基础正则表达式篇
  3. 【论文解读】无需额外数据、Tricks、架构调整,CMU开源首个将ResNet50精度提升至80%+新方法...
  4. 最后两周!60万奖金AI攻防赛进入冲刺(附baseline代码及实操)
  5. 索引 - 数据结构 - B+TREE
  6. jdk8和hotspot_HotSpot的-XshowSettings标志的简单性和价值
  7. VS在win32平台与mysql链接_mysql5.5.28-win32 + qt--4.8.2-vs2008 数据库驱动编译与连接...
  8. webpack配置路径问题
  9. 瑞士:冰川融化 阿尔卑斯部分山体面临坍塌
  10. python中pickle模块_python中的pickle模块
  11. ERP开发分享 1 数据库表设计
  12. 光谱数据处理及定量分析
  13. 常见反爬虫策略与绕过方法
  14. 度分秒在线计算机,科学计算器在线计算
  15. bat文件实现ftp上传和下载
  16. 数据结构课程设计 # 论文查重分析系统 (C/C++版和python版)
  17. (译)在cocos2d里面如何使用物理引擎box2d:弹球
  18. [转]不管你学的是什么专业,你都应该多少懂些管理学的东西
  19. React Parameter ‘from‘ implicitly has an ‘any‘ type.
  20. js加载并显示excel文件

热门文章

  1. Typora修改图片保存位置
  2. 笔记本计算机回收站在哪里,电脑回收站不见了怎么办 四种方法教你快速解决问题【图文教程】...
  3. mysql如何存入汉字_[MYSQL]如何导入汉字单字到数据库
  4. 怎么把PDF转换成图片?这几种转换方法都可以做到
  5. Emacs是一种信仰!世界最强编辑器介绍
  6. 去除硬盘安全删除硬件图标
  7. 深度学习中的类别激活热图可视化
  8. Perl-LWP文档
  9. uniapp 实现微信小程序全局分享及自定义分享按钮样式
  10. 用php语言说句情话,最甜蜜的情话句子(精选50句)