解析Bellman-Ford算法求最短路径

算法导论 第24章 单源最短路径 最短路径的定义     在最短路径问题中,给出的是一个带权有向图G=(V,E),加权函数w:E->R为从边到实值的映射。路径p = 的权是其组成该路径的各边的权值之和: 定义从u到v的最短路径的权为: 从顶点u到v的最短路径为权值等于最短路径权值的任何路径。 单源路径问题的诸多变体     单终点最短路径:找出每个顶点v指向终点t的最短路径。将原有向图的每条边反向 阅读详情

上一篇博文已经说了用dijkstra算法来求图(有向图和无向图)的最短路径了,那么怎么还需要使用Bellman-Ford算法来求解最短路径问题呢?其实这两个算法有各自求解的限制条件:dijkstra算法不能求解包含负权的图;但是用矩阵来存储图的话,那么Bellman-Ford算法时间复杂度达O(n3),所以这也是一个限制。但是还有一个改良的Bellman-Ford算法,其时间复杂度只为O(n2),这个算法到后面再给出。

        下面说明下dijkstra算法和Bellman-Ford算法的求解,而dijkstra算法无法求解负权图的原因吧!请看下图(本图片来自百度文库 用户:1107905594)


          我可以从这个图中及其求解过程及其结果看到,dijkstra算法在求解带负权的图的最短路径是不合理的,因为它需要找的下一个点都必须是与自己相邻的并且路径最短的一个点,所以逐步迭代下去,最终他会忽略权为负值得边,比如图中的E(v0,v1)=7>E(v0,v2),因此,根据该算法的选边原则,它将会选择边E(v0,v1),所以就导致忽略了后面的E(v1,v2)=-2的边,这样一来就误求了v0->v2的最短路径,因为min(v0->v2)=2。到目前你也许明白了为什么dijkstra算法不适用求带负权的图了。
          现在就说下Bellman-Ford算法的基本步骤和基本思想。
  • 下Bellman-Ford算法基本思想
  •  Bellman-Ford算法的基本步骤

            1、首先将所求起点s到图中的各点距离用数组dist[n]存储起来,如果两边可达,则dist[i]=Edge[s][i],否则则灵dist[i]=maxm,(maxm为一个无穷大值,根据需要设定数值),(注意:这里假设不允许顶点自身可达)。

            2、然后通过通过循环n-2次找出含有最多含有n-1条边的路径的最小路径数组path[u]=v,这个数组也是通过保存当前顶点v的最短路径前缀u。最后也是通过读取前缀得出一条路径。由于第一步将第一条边已经保存下来,所以这里只须循环n-2次就可以了。这一步很关键,因为这一步是说怎么去找出每个节点的最短路径的呢?然而,在n-2次循环中,每循环一次,他都将保存好当前节点v离始点的最短距离的前缀u,所以一维数组path[n]保存了图中所有可达节点到节点v的最短路径前缀。最后就得到结果path[n]。

           代码的编写就不写了,借别人的用一下。





本博文翻译于一百度文库用户,有侵权之处请见谅,通知本人删除。

《算法笔记》—— 图 "最短路径" 之 Bellman-Ford 算法 最短路径相关文章: 《算法笔记》—— 图 “最短路径” 之 Floyd-Warshall算法、Diljkstra算法 上面链接的文章之中有个算法是 Dilijkstra算法,这个算法解决单源最短路径问题,但是它 不能解决带有负权边(边的权值为负数)的图。 此文将介绍 Bellman-Ford算法,它完美了解决负权的这个问题,并且此文将介绍对此算法各种的优化操作,比如:使用队列的方式对此算法进行优化 . . . . 文章目录 Bellman-Ford 算法解析 Bellman-Ford 算法优化. 阅读详情

相关推荐

【最短路径算法】#2 贝尔曼福特Bellman-Ford与弗洛伊德Floyd

T_TLucas_Yin的博客 1949

bellman-ford最短路径算法

1.算法适用情况 1.1 这个算法适用于图中有负权值的边的最短路径的计算 2.2 这个算法可以用来判断图中是否有总权值为负的环存在 2.算法思想 2.1 算法是对图中的边集进行操作的,这和Dijkstra算法不同 2.2 算法是从源节点来进行广度搜索并完成最小生成树的建立的 2.3 算法需要执行|V|-1次的大循环,以此来确保找到|V|-1个最短路径。每个循环中是对所有边的一个小循环操作。因此时间复杂度为O(|V|*|E|)。注意每次大循环必定会找到大于等于一个节点的最短路径,这一点深究可以去看看其他文章。

flying_coding的博客 595

图的最短路径:Dijkstra算法和Bellman-Ford算法(C++)

本文介绍图的最短路径算法, 包含Dijkstra算法和Bellman-Ford算法. 通过图示和代码希望能帮助读者理解.

一些C++相关的技术笔记或者教程. 1761

贝尔曼-福特算法(Bellman-Ford)最短路径问题

贝尔曼-福特算法(Bellman-Ford)一、贝尔曼-福特算法(Bellman-Ford)二、代码实现 一、贝尔曼-福特算法(Bellman-Ford) 贝尔曼-福特算法与迪科斯彻算法类似,都以松弛操作为基础,即估计的最短路径值渐渐地被更加准确的值替代,直至得到最优解。在两个算法中,计算时每个边之间的估计距离值都比真实值大,并且被新找到路径的最小长度替代。 然而,迪科斯彻算法以贪心法选取未被处理的具有最小权值的节点,然后对其的出边进行松弛操作;而贝尔曼-福特算法简单地对所有边进行松弛操作,共 次,其中

Axiayouqiaomu的博客 1121

【保研经验】北科自动化到北大工学院

作者:办公室某学长 谢邀。。。作为拖延症晚期患者,希望能在我科开学前写完。 先简单介绍一下我的保研过程,申请了清华叉院&北大叉院大数据&北大信科计算机夏令营,三者都没入营;申请了自所夏令营(自所来宣讲时未交简历,这是重大错误),给了第二批补录但没去;最终九推去了北大工学院。我的这次保研最终成功的经历可以说有一定运气成分,不具有普适性,但在前期准备过程中还是有经验可以分享的。 ...

ruanjianbu的博客 1798

【CarMaker实战指南】从零构建环形测试场景与车辆连续仿真

本文详细介绍了如何使用CarMaker软件从零构建环形测试场景与实现车辆连续仿真。通过分步指导搭建闭环道路、连接交叉路口、规划车辆轨迹等核心操作,帮助用户掌握CarMaker的基础应用技巧,并提供了常见问题排查与进阶优化建议,适用于车辆耐久性测试和自动驾驶算法验证等场景。

weixin_29274969的博客 235

算法系列——贝尔曼福特算法(Bellman-Ford)

本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节。我在努力! 本篇文章编程语言为Python,供参考。 贝尔曼福特算法(Bellman-Ford) 典型最短路径算法,用于计算一个节点到其他节点的最短路径。(Dijkstra算法也是) 基本原理:逐遍的对图中每一个边去迭代计算起始点到其余各点的最短路径,执行N-1遍,最终得到起始点到其余各点的最短路径。(N为连通图结点数) 与迪杰斯特拉算法的区别: 1. 迪杰斯特拉算法是借助贪心思想...

lzh1366的博客 2万+

4D毫米波雷达

详解4D成像毫米波雷达

sangba2019的博客 2393

最短路径3---Bellman-Ford算法

通用最短路径算法 distTo[s]初始化0,其余值初始化无穷大,放松G中的任意边,直到不存在有效边为止。此时distTo[w]即为从s到w的最短路径长度,且edgeTo[w]=e表示该最短路径的最后一条边为e。 Dijkstra算法----权重非负的加权有向图最短路径 从通用最短路径算法出发,distTo[s]初始化0,其余值初始化无穷大。不断将distTo[]中最小的非树顶点放松并加入树...

大魔王 477

【Clickhouse】Clickhouse写入报错keeper server rejected the connection during the handshake

我的clickhouse集群时不时的报这个错误All connection tries failed while connecting to ZooKeeper. nodes: xxx 到时写入数据失败 用的ck自带的keeper。你需要仔细检查ZooKeeper集群的配置和状态,确保所有节点都正常运行,并且能够正确地选举领导者。检查ZooKeeper的ACL以及ClickHouse连接所使用的凭据,确保它们被正确配置和授权。版本不兼容:有时,不同版本的软件之间可能存在不兼容性,导致连接问题。

九师兄 373

初学者入门YOLO目标检测:从懵圈到上手,这篇文章讲透所有核心(附学习路径+避坑指南)

目标:比如训练一个“检测苹果和橘子”的模型,或者“检测人脸”的模型;任务:学会用LabelImg标注数据,制作YOLO格式的数据集,用命令行训练模型;关键:不用追求高精度,能训练出一个能检测出目标的模型就行。很多初学者卡在入门阶段,不是因为智商不够,而是因为“想太多,做太少”——总觉得要把所有原理搞懂才能动手,结果越想越怕,最后放弃。先动手,再动脑。先跑通一个案例,获得成就感;再制作自定义数据集,训练简单模型;最后再回头去理解原理,优化模型。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 691

数学建模常用算法—贝尔曼-福特算法求最短路径(Bellman-Ford)

贝尔曼-福特算法(Bellman–Ford)是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。它的原理是对图进行次松弛操作,得到所有可能的最短路径。

简简单单的学习笔记,致力于帮助更多前进路上的朋友~ 2947

【SpringBoot 3.x 第56节】再见 Feign?原生 HTTP 接口强势上位,这才是微服务调用的正确姿势!

🏆本文收录于《滚雪球学SpringBoot 3》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    本专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。    若还想学习更多,可直接前往《滚雪球学SpringBoot(全版本合集)》,涵盖SpringBoot所有版本教学文章

**My Coding Family** 1017

求最短路径的3种基本方法

求最短路径的3种基本方法 情景简述:n个城市,m条道路,已知每条道路的长度。 1.多源最短路:Floyd-Warshall算法 2.单源最短路:Dijkstra算法 3.1解决负权边:Bellman-Ford算法 3.2Bellman-Ford的队列优化 总体思路就是:借助中间中间城市 来使得该城市相连的两个城市的路径变短。(就好比A要找C办事,但A不认识C,处理事情就相对麻烦。但A认识B, B认...

weixin_43414130的博客 2万+

【Agent从入门到实践】01 从“工具函数”到“智能体”:Agent与传统程序的核心区别

传统程序是“你教它怎么做,它才做什么”,Agent是“你告诉它做什么,它自己想怎么做”。从技术层面来说,这个区别的背后,是Agent融合了大语言模型(LLM)、记忆能力、工具调用能力、决策能力等技术,才实现了“自主思考”和“灵活执行”,而这些技术,咱们会在后面的章节中一步步拆解,手把手教大家实现。

人工智能AI技术 989

通过 MATLAB/Simulink + Simscape Battery,构建了锂电池老化模型与容量衰减仿真系统

本文基于MATLAB/Simulink平台,构建锂电池老化模型与容量衰减仿真系统,研究储能电池健康管理技术。通过搭建电化学-老化耦合模型,模拟循环和日历老化机制,分析温度、充放电倍率、DOD等因素对电池寿命的影响。系统实现了SOH在线估计和RUL预测功能,仿真了标准日历老化、高倍率循环和峰谷套利等典型工况下的电池衰减行为。结果表明:高温和深充放会显著加速电池老化,而精准的SOH管理可提升储能系统经济性30%以上。文章还探讨了数字孪生、机器学习等高级优化方向,为储能系统长周期运营提供技术支撑。

xiaoheshang_123的博客 400

图论的一些基础算法的模板

Floyd 算法: 作用:求任意两点最短路 时间:O(V^3) #define for0(i,a,b) for (int i=a;i<b;i++) memset(dp,INF,sizeof dp); for0(i,0,n) dp[i][i] = 0; int u,v,w; for0(i,0,m){ scanf("%d %d %d",&u,&v,&w);...

shadiao.的博客 174

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入prometeo堆内存分析:Bellman-Ford算法如何计算最坏情况内存使用

嵌入式系统的内存寸土寸金,而 prometeo——一个实验性的 Python 到 C 转译器兼领域特定语言(DSL)——用一套精巧的静态分析方案解决堆内存难题。它先把 Python 程序转译为 C 代码,再借助调用图分析与经典的 **Bellman-Ford 最短路算法**,自动算出程序的**最坏情况内存使用**,从而在编译期为每个矩阵精确预留堆空间。本文面向零基础读者,一步步拆解 promete

gitblog_00697的博客 376

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

常用算法模板总结1

朴素版Dijkstra算法 核心思路: 1.循环n次,每次找到到起点距离最小且不在已确定集合中的的点 2.将找到的点放入集合中 3.用找到的点来更新其他所有未在集合之中的点 代码: #include <iostream> #include <cstring> #include <algorithm> using namespace std; int n,m; const int N = 510,M=1e5+10; int g[N][N]; int dist.

weixin_62224014的博客 799

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

图论模板(未完成)(有错但暂时不改)

图的传递闭包 判断结点 iii 到 jjj 是否有路径 for(int i = 1; i <= n; i++) can[i][i] = true; for(int k = 1; k <= n; k++) for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) can[i][j] |= (cam[i][k...

qyxpsx7的博客 226

对于最短路问题的复习与总结

最短路问题复习与总结

weixin_63842313的博客 348

最短路

Dijkstra #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N=510; int g[N][N]; int dist[N]; bool st[N]; int n,m; int dijs() { memset(dist,0x3f,sizeof dist); dist[1]=0; for(int i=0;i<n-1;i++) {

weixin_50909982的博客 149

2018年8月24日训练日记

Bellman_Ford算法和spfa算法:同样是求单源最短路,一般只用spfa模板,可以判负权环。注意多点到一点的最短距离可以建立反向图再跑spfa。注意最短路条件的修改。 差分约束:本质还是最短路。给出n个人的限制条件,求第一个人和最后一个人最多差多少,化为d[a]-d[b]&lt;=c 然后建立b到a权值为c的边。答案是d[n-1]-d[0]。有的时候为了避免b为负,整体加上一个值。注意有...

LSD20164388的博客 342

Day62 >> 97、小明逛公园 + 127、骑士的攻击 + 最短路算法总结 + 图论总结

【代码】Day62 >> 97、小明逛公园 + 127、骑士的攻击 + 最短路算法总结 + 图论总结。

weixin_46660114的博客 47

最短路径Bellman-Ford算法和SPFA算法详解

最短路径Bellman-Ford算法和SPFA算法详解

m0_72674633的博客 1686

Bellman-Ford算法

Bellman-Ford算法大致可以分成三部分: 1.初始化所有d[s],源点d[s]=0,其他d[s]=INF 2.进行n-1次循环,在循环体中遍历所有的边,进行松弛计算(if(d[v]>d[u]+w[u][v]) d[v]=d[u]+w[u][v]) 3.遍历图中所有的边,检验是否出现这种情况:d[v]>d[u]+w[u][v],若出现则返回false,没有最短路 Bel...

策马奔腾向前冲 1万+
上一篇: 最长有效括号
下一篇: 回文字符串
wingahi
博客等级 码龄15年 15粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值