当前位置: 首页 > news >正文

多源最短路径算法–Floyd算法

多源最短路径算法–Floyd算法

Floyd算法是为了求出每一对顶点之间的最短路径

它使用了动态规划的思想,将问题的求解分为了多个阶段

先来个例子,这是个有向图

image-20240603204954672

Floyd算法的运行需要两个矩阵

最短路径矩阵

从当前这个状态看各顶点间的最短路径长度

例如初始状态

image-20240603205335892

可以看出这是该有向图的邻接矩阵

顶点之间中转点矩阵

初始状态都没有中转点

image-20240603205552462

引入中转点

A(k-1)代表引入顶点k-1时,各个顶点的最短路径状态

path(k-1)代表引入顶点k-1后,各个顶点的最短路径需要经过哪个结点

image-20240603205810674

判断顶点i到顶点j,如果经过顶点k,是否会更短?

如果更短,改变A(k-1)数组中i结点到j结点的最短路径,同时更改path(k)数组,表明经过顶点k,顶点i到顶点j路径更短

  1. 允许在V0中转,计算出当前的最短路径

顶点2到顶点1

image-20240603211244772

image-20240603212147797

可以看到原来顶点2到顶点1是没有路径的,通过V0之后,最短路径变为11,那么更新A(0)数组,A(0)数组代表引入V0之后个顶点之间的最短路径,同是更新path(0)数组,代表V2到V1经过了V0

image-20240603211526708

image-20240603211546106

  1. 允许在V0,V1中转,计算出当前的最短路径

顶点0到顶点2

image-20240603211954682

image-20240603212231260

可以看到原来顶点0到顶点2的距离是13,通过V1之后,最短路径变为10,那么更新A(1)数组,A(1)数组代表引入V1之后个顶点之间的最短路径,同是更新path(1)数组,代表V0到V2经过了V1

image-20240603212030290

image-20240603212106992

  1. 允许在V0,V1,V2中转,计算出当前的最短路径

顶点1到顶点0

image-20240603212721776

image-20240603212106992

可以看到原来顶点1到顶点0的距离是10,通过V1之后,最短路径变为9,那么更新A(2)数组,A(2)数组代表引入V2之后个顶点之间的最短路径,同是更新path(2)数组,代表V1到V0经过了V2

image-20240603212902031

  1. 最终结果

image-20240603212954609

  1. 核心代码

image-20240603213039178

再看一个新的例子

image-20240603213128063

  1. 允许在V0中转,k=0

image-20240603213256094

所有结点之间都不能通过V0获得更短的路径,故不更新A(0)数组和path(0)数组

image-20240603213354113

  1. 允许在V0,V1中转,k=1

image-20240603213500090

image-20240603213531346

V2到V3和V2到V4经过V0,V1中转有更短的路径,故更新A(1)数组和path(1)数组

image-20240603213702181

  1. 允许在V0,V1,V2中转,k=2

image-20240603213912757

image-20240603213941700

V0到V1,V0到V3,V0到V4经过V0,V1,V2中转有更短的路径,故更新A(2)数组和path(2)数组

image-20240603214117232

  1. 允许在V0,V1,V2,V3中转,k=3

image-20240603214152875

image-20240603214208631

V0到V4,V1到V4,V2到V4经过V0,V1,V2,V3中转有更短的路径,故更新A(3)数组和path(3)数组

image-20240603214309276

  1. 允许在V0,V1,V2,V3,V4中转,k=4

image-20240603214352782

所有结点之间都不能通过V4获得更短的路径,故不更新A(4)数组和path(4)数组

image-20240603214458711

注意

  1. Floyd算法不能解决带有“负权回路”的图,这种图可能没有最短路径
http://www.lryc.cn/news/366264.html

相关文章:

  • 使用Redis缓存实现短信登录逻辑,手机验证码缓存,用户信息缓存
  • 探索未来制造,BFT Robotics引领潮流
  • 数组中的第K个最大元素 ---- 分治-快排
  • 函数或变量 ‘tfrstft‘ 无法识别
  • 在推荐四款软件卸载工具,让流氓软件无处遁形
  • 「前端+鸿蒙」核心技术HTML5+CSS3(十一)
  • 【高频】如何优化一个SQL语句
  • Oracle EBS AP发票创建会计科目提示:APP-SQLAP-10710:无法联机创建会计分录
  • T-Pot多功能蜜罐实践@debian12@FreeBSD
  • Sed流编辑器总结
  • 智合同丨AIGC如何助力合同智能应用
  • CSRF 令牌的生成过程和检查过程
  • 计算机网络学习记录 网络层 Day4(下)
  • 3、前端本地环境搭建
  • Python爬取城市空气质量数据
  • 【MyBatisPlus条件构造器】
  • 容器多机部署eureka及相关集群服务出现 Request execution failed with message: AuthScheme is null
  • Qt Graphics View Framework 使用教程
  • 【调试笔记-20240606-Linux-为 OpenWrt 的 nginx 服务器添加Shell CGI 支持】
  • flink实战--⼤状态作业调优实践指南-Flink SQL 作业篇
  • 数据结构:顺序串
  • 掌握复选框(Checkbox)的奥秘:全选与反选功能实现
  • 一篇文章带你搞懂C++引用(建议收藏)
  • 查询SQL:文章浏览1
  • android 在onCreate方法中获得view的宽高
  • SOA主要协议和规范
  • 30、matlab现代滤波:维纳滤波/LMS算法滤波/小波变换滤波
  • HTML5 视频 Vedio 标签详解
  • 三十五篇:数字化转型的引擎:赋能企业的ERP系统全景
  • 利用ArcGIS对长江三角洲地区的gdp水平进行聚类