一 背景介绍

如果求解任意两个节点之间的最短路径,则需要以每个节点为源点,重复调用 n 次 DijKstra 算法。其实是完全没有必要这么麻烦,Floyd 算法可用于求解任意两个节点之间的最短距离。Floyd 算法又被称为插点法,其核心思想是在节点 i 与 j 之间插入节点 k,看看是否可以缩短节点 i 和 j 之间的距离。

二 算法步骤

1 数据结构

设置地图带权邻接矩阵为 G.Ege[][],即如果从节点 i 到节点 j 有边,则 G.Ege[i][j]=<i,j>的权值,否则 G.Ege[i][j]=无穷大;采用两个辅助数组:最短距离数组dist[i][j],记录从节点 i 到节点 j 的最短路径长度;前驱数组 p[i][j],记录从节点 i 到节点 j 的最短路径商节点 j 的前驱。

2 初始化

初始化 dist[i][j]=G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化 p[i][j]=i,否则 p[i][j]=-1。

3 插点

在节点 i 和 j 之间插入节点 k,看是否可以缩短节点 i、j 之间的距离。如果 dist[i][j] > dist[i][k] + dist[k][j],则 dist[i][j] = dist[i][k] + dist[k][j],记录节点 j 的前驱 p[i][j]=p[k][j]。

三 图解

最初的地图如下:

1 数据结构

最初 G.Ege[i][j] 的权值如下

2 初始化

初始化最短距离数组为 G.Ege[i][j],如果从节点 i 到节点 j 有边相连,则初始化前驱数组 p[i][j]=i,否则 p[i][j]=-1。初始化 dist[][] 和 p[][],如下图所示。

3 针对 k=0 进行插点

插入后的路径可能有 2 条。

2 0 1

2 0 3

插入后 dist[][] 和 p[][],如下图所示。

4 针对 k=1 进行插点

插入后的路径可能有有 4 条。

0 1 2

0 1 3

2 1 0

2 1 3

插入后 dist[][] 和 p[][],如下图所示。

5 针对 k=2 进行插点

插入后的路径可能有 6 条。

1 2 0

1 2 3

3 2 0

3 2 1

插入后 dist[][] 和 p[][],如下图所示。

6 针对 k=3 进行插点

0 3 1

0 3 2

1 3 0

1 3 2

2 3 0

2 3 1

插入后 dist[][] 和 p[][],如下图所示。

7 插点结束

dist[][] 包含了各个节点之间的最短距离。可从 p[][] 推测出各个节点的最短路径。

Floyd 算法介绍相关推荐

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

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

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

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

  3. 最短路径—Dijkstra算法和Floyd算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Di ...

  4. 最短路径算法——Dijkstra and Floyd算法

    一.     前言:     这个古老的算法应该耳熟能详了吧,但是我自从从学校出来到现在,最短路径算法都没有实际运用过,最近在一个GIS项目中总算用到了,于是乎把教材重温了下,同时查阅了网上很多的资料 ...

  5. 短小精悍的多源最短路径算法—Floyd算法

    前言 在图论中,在寻路最短路径中除了Dijkstra算法以外,还有Floyd算法也是非常经典,然而两种算法还是有区别的,Floyd主要计算多源最短路径. 在单源正权值最短路径,我们会用Dijkstra ...

  6. “chaos”的算法--之Floyd算法详解(求最短路径)

    倘若我们要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络.其实现最基本的功能,求出任意两点间的最短路径, 求最短路径的经典方法有很多种,最常用的便是迪杰斯特拉算法和佛洛依德(Fl ...

  7. 最短路径:Dijkstra算法和Floyd算法

    一.Dijkstra算法(单个顶点到其他顶点的最短距离) 定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层 ...

  8. 任意两点最短路floyd算法matlab,多源最短路——Floyd算法

    Floyd算法 问题的提出:已知一个有向网(或者无向网),对每一对定点vi!=vj,要求求出vi与vj之间的最短路径和最短路径的长度. 解决该问题有以下两种方法: (1)轮流以每一个定点为源点,重复执 ...

  9. Floyd算法的动态规划本质

    Floyd–Warshall(简称Floyd算法)是一种著名的解决任意两点间的最短路径(All Paris Shortest Paths,APSP)的算法.从表面上粗看,Floyd算法是一个非常简单的 ...

最新文章

  1. 超详细教你10分钟搭建一个高端的B2B2C模式的综合性商城|含来客推V3源码下载
  2. vs 输入代码时出现火花_在Visual Basic的立即窗口内输入以下语句 X=65
  3. ML之回归预测之BE:利用BE算法解决回归(实数值评分预测)问题—线性方法解决非线性问题
  4. Dora.Interception: 一个为.NET Core度身定制的AOP框架
  5. Ajax实现异步操作实例_针对XML格式的请求数据
  6. 前端:JS操作数字类库
  7. 同步电脑与手机,让手机变身无线Modem
  8. mysql查询m到n条数据库,对查询数据库中第M到N条记录的思考
  9. javascript模式 (3)——工厂模式和装饰模式
  10. 马云卸任演讲全文:青山不改 绿水长流 后会有期
  11. WIN7搭建web服务器的步骤
  12. Centos6下Redis学习(一)——Java客户端Lettuce的使用、Springboot整合
  13. Ubuntu18.04 ROS Melodic版本安装gazebo_ros_pkgs包
  14. 使用Matlab工具箱(procamcalib)进行投影仪标定---超详细过程
  15. mysql ndb 关闭_MySQL NDB Cluster环境启动与关闭
  16. 线性代数 —— 线性组合与线性表出,线性相关与线性无关
  17. MySql将两个字段查询值合并拼接
  18. html5 端午节 龙舟,端午节赛龙舟的作文(精选10篇)
  19. 使用NumPy加载txt文件提示ValueError:could not convert string to float
  20. promise.all的用法讲解。

热门文章

  1. swiftUI系列-我的个人side project开始,19年入门iOS开发
  2. python docx 合并文档 图片_Python和Word的交互批量生成报告
  3. oracle创建实例ora28040,【案例】Oracle报错ORA-28040 No matching authentication
  4. 爬虫入门实践之图片爬虫
  5. 一场聚会,从实施转行软件测试月薪13.5k,感谢那位女同学....
  6. css3动画边框一闪一闪,css3动画条纹边框_觉唯设计
  7. 请教:APNS的device token每个设备每个app都唯一吗
  8. 中国式家长计算机科学家结局,《中国式家长》女儿版结局及属性奖励一览
  9. c语言中int占两个字节short,选择.设C语言中,int类型数据占2个字节,则short类型数据占几个字节...
  10. 56.画pcb尺子笔记