最短路简介(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}}

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

太帅辣

本科参加ACM竞赛的过程中积累下来的一部分算法模板,和自己在PKU上面做的一部分题目。 模板目录结构: 目录: 动态规划 O(n^2)的最长上升子序列 nlogn最长上升子序列 高精度 计算几何 Graham扫描法 两线段交点 凸多边形面积 半平面交 计算几何库 数据结构 闭散列法整数hash 开散列法整数hash 字符串hash 堆 二维树状数组 Trie树 二叉查找树 线段树 RMQ LCA+RMQ SB-Tree 数论 生成紧凑素数表 分解质因子 最大公约数 a^b mod n 扩张欧几里德算法 素数表质因子分解 Stirling公式 中国剩余定理 欧拉数(递推法) 欧拉数(公式法) 十进制转负进制 归并排序求逆序数 Pell方程 Catalan数,100以内 欧拉函数讲解 组合计数 组合数计算(double) 组合数计算(高精度) r-组合生成算法 r-排列生成算法 r-错位排列生成算法 图论 传递闭包 欧拉回路判定 有向图欧拉路径 二分图最大匹配 匈牙利算法 二分图最大匹配 HK算法 二分图最大权匹配 KM算法 割边 强连通分量 缩点 Kosaraju算法 最大团 最小树形图 无向图全局最小割 stoer-wagner O(n^3) 最短路径优先算法 SPFA 网络流 最大流:Ford&Fulkerson算法 最大流:Dinic算法 最大流:ek算法 最大流:dsp算法 最大流:hlpp算法 最小费用最大流:bellman_ford找增广路 最小费用最大流:ssp算法 字符串 KMP 通配符匹配 最小表示法 后缀数组 倍增算法 基于多串匹配的有限状态自动机 未分类 归并排序 星期几的计算 N皇后构造法 几个常用的位操作 最大最小定理总结 0/1分数规划总结 (by yxysdcl 2008/11/19) 代码目录结构: 目录: 动态规划 钉子和小球 Hash+dp分词(摩尔电码) 火柴棒等式 DAG图DP,老鼠打洞 最短子路径 最少回文数 矩阵链乘 树形DP 最少的石子填到根节点 树种删除最少的边使刚好剩下P个点 树的支配集 最优连通子集 带背包的树形DP 最小顶点覆盖,判唯一 用最少的点覆盖所有的边 DAG上的记忆化树形DP,博弈 有限状态自动机+树形DP 状态压缩DP 炮兵阵地 Help Bob,买匹萨 匹配数量 堆筛子 全排列式状态DP 计算几何 多边形地图染色 数据结构 Hash 枚举+hash,方程解数 点集对称中心 字符hash,统计出现最多的单词 类此The Happy worm 数据结构 树状数组 覆盖某区间数量统计 Cows Stars 两个树桩数组 二维树状数组 数据结构 双端队列 Sliding Window 数据结构 线段树 Cows 线段染色 排队问题 第K大的数 离散化+线段树 灯光投影 网络赛取连续子序列问题 线段树+树状数组+并查集,转化为排队问题 离散化 离散化矩形切割,矩形覆盖面积统计 覆盖矩形周长统计 离散化矩形切割 灯光投影 搜索 导弹 Bfs+hash状态的抽象,模关系 Bfs变形,钥匙与门 双向广搜 迭代加深 优先队列搜索,过最少的门救人,建图 A*搜索 图论 差分约束 Intervals bellman_ford Intervals SPFA 出纳员的雇佣 不等式组 图论 割边 图染色 拓扑 树 欧拉路径) 割点+统计删除后剩下多少连通图 删除一个点使得连通分量最多 图染色 拓扑排序全部序列 最大生成树 有向图欧拉路径 字典序最小的有向图欧拉路径 图论 匹配 完美匹配FBI Koning定理,泥地 二分图最大独立集 通讯站天线覆盖 二分图拆分后匹配 二分图某边唯一匹配 最小权匹配 海上矿工 floyd预处理 最大权匹配,需要非完全图转完全图 传递闭包+最小路径覆盖 可以重复经过点 图论 网络流 Adding-the-maximum-flow arc 增量网络流 区间枚举,猴子语言+网络流 最小费用最大流 最大流最小割定理 摧毁伞兵 最大流最小割定理 泥地 图论 最短路Dijkstra+heap 昂贵的聘礼 最短路变形 树中任意点对最短路Bellman_ford 货率 限制长度最短路,负环判连通,点权变边权,改变正负号 表达式求值 算法优先算法求表达式的值 词法分析与算法优先算法,集合运算:差集,并集,交集 矩阵乘法 线段覆盖数量 矩阵构造,nlogn矩阵乘法 2-SAT XOR

1,040

社区成员

发帖
与我相关
我的任务
社区描述
中南民族大学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创作助手写篇文章吧