最短路简介(Floyd、Bellman_Ford、SPFA、Dijkstra)

illjlack 2023-03-30 13:08:39

 

在图论中最短路径是两个节点之间经过的边权值之和最小的路径,是一种在图上的搜索,满足最优子结构(可以使用动态规划和贪心算法)

最优子结构:最短路径的子路径也是最短路径(有可以到达的负环的图不满足最优子结构)

单源最短路问题

找到从给定源节点到其它节点的最短路径

相关算法

Floyd

动态规划的思想,是多源的(算出了每两个节点的最短距离),复杂度O(n^3)

用f[k][x][y]表示中间只经过1~k的点的最短路,转移为:f[k][x][y]=min(f[k-1][x][y]/*x->y不经过k点的情况*/,f[k-1][x][k]+f[k-1][k][y]/*x->y经过k点情况*/)

第k层依赖k-1层,每一层x,y都要遍历完,自底向上动态规划,复杂度O(n^3)

Bellman_Ford

动态规划的思想,是单源的,复杂度O(nm)

Bellman-Ford 算法的基本思想是对所有边进行松弛操作,每次松弛操作都会更新一些最短路径的估计值。算法进行 n-1 轮松弛操作,其中 n 是图中顶点的数量。在每一轮松弛操作中,算法都会遍历图中的所有边,对每一条边进行松弛操作。

可以这么想:f[k][x]表示从起点到x最多经过k条边的最短路

转移为:f[k][x]=min_{(y,x)\in E}(f[k-1][x],f[k-1][y]+w_{y->x})

第k层依赖k-1层,每一层要遍历完所有边(没有入度的边也要更新),自底向上动态规划,复杂度O(nm)

//Floyd、Bellman_Ford实际用的时候,不用分层,分层隔绝了每层先更新部分对后更新的依赖的影响,这里的影响是好的所以不用分层

SPFA(Shortest Path Faster Algorithm)

bellman_ford的队列优化,它利用了这样一个事实:在进行松弛操作时,只有那些在上一轮松弛操作中发生变化的顶点才可能对其他顶点产生影响。

基于这个观察,SPFA 算法使用一个队列来维护所有可能对其他顶点产生影响的顶点。

SPFA 算法的时间复杂度取决于具体的图结构和边权分布。在最坏情况下,它的时间复杂度与 Bellman-Ford 算法相同,为 O(nm),但在实际应用中,SPFA 算法通常比 Bellman-Ford 算法快很多。

Dijkstra

贪心思想,是单源最短路径问题的。它不能处理带有负权边的图。

每次选择距离源点最近的未确定顶点,然后更新与其相邻顶点的最短路径长度。

复杂度O(n^2+m),其中一个n是n次贪心,另一个n是找最近点,m是所有边会遍历一遍。

找点可以维护一个优先队列等操作优化,比Bellman_Ford快。

因为贪心算法只看下一步,所以它不能处理带有负权边的图。比如下图:它会按序号更新,不会更新已经遍历的点,下面的情况就出错了

 

 

拓展(思考)

  • 对于动态规划,重要的是能设计出dp的顺序

  • 一般图的最长路因为没有最优子结构所以是NP问题,只能硬搜

  • DAG(有向无环图)上,最短、最长路都满足最优子结构,所以能用dp,先拓扑排序,按dp顺序转移dp[i]=max_{j\in from[i]}{dp[i],dp[j]+w_{ji}}

...全文
168 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
给小猫咪顺毛 2023-03-30
  • 打赏
  • 举报
回复

太帅辣

1,033

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学CSDN高校俱乐部聚焦校内IT技术爱好者,通过构建系统化的内容和运营体系,旨在将中南民族大学CSDN社区变成校内最大的技术交流沟通平台。
经验分享 高校 湖北省·武汉市
社区管理员
  • c_university_1575
  • WhiteGlint666
  • wzh_scuec
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎各位加入中南民族大学&&CSDN高校俱乐部社区(官方QQ群:908527260),成为CSDN高校俱乐部的成员具体步骤(必填),填写如下表单,表单链接如下:
人才储备数据库及线上礼品发放表单邀请人吴钟昊:https://ddz.red/CSDN
CSDN高校俱乐部是给大家提供技术分享交流的平台,会不定期的给大家分享CSDN方面的相关比赛以及活动或实习报名链接,希望大家一起努力加油!共同建设中南民族大学良好的技术知识分享社区。

注意:

1.社区成员不得在社区发布违反社会主义核心价值观的言论。

2.社区成员不得在社区内谈及政治敏感话题。

3.该社区为知识分享的平台,可以相互探讨、交流学习经验,尽量不在社区谈论其他无关话题。

试试用AI创作助手写篇文章吧