【算法分析与设计】图:bellman-ford算法

Bellman-Ford算法 参考: Single-Source Shortest Path:Bellman-Ford Algorithm SPFA——基于Bellman-Ford的队列优化 How is the Bellman Ford algorithm a case of dynamic programming? Shortest Path and Dynamic Programming Algorithms ... 阅读详情

前半部分内容参考自这篇博客

介绍

Bellman-Ford 算法是一种用于计算带权有向图中单源最短路径(SSSP:Single-Source Shortest Path)的算法。该算法由 Richard Bellman 和 Lester Ford 分别发表于 1958 年和 1956 年,而实际上 Edward F. Moore 也在 1957 年发布了相同的算法,因此,此算法也常被称为 Bellman-Ford-Moore 算法。

Bellman-Ford 算法和 Dijkstra 算法同为解决单源最短路径的算法。对于带权有向图 G = (V, E),Dijkstra 算法要求图 G 中边的权值均为非负,而 Bellman-Ford 算法能适应一般的情况(即存在负权边的情况)。一个实现的很好的 Dijkstra 算法比 Bellman-Ford 算法的运行时间要低。

Bellman-Ford 算法采用动态规划(Dynamic Programming)进行设计,实现的时间复杂度为 O(V*E),其中 V 为顶点数量,E 为边的数量。Dijkstra 算法采用贪心算法(Greedy Algorithm)范式进行设计,普通实现的时间复杂度为 O(V2),若基于 Fibonacci heap 的最小优先队列实现版本则时间复杂度为 O(E + VlogV)。

算法过程

假设图中的顶点A, B, C, D, E,求顶点A到其他顶点的最短距离。首先初始化A到其他顶点的距离为无穷大,同时初始化一个待处理顶点库为【A】:
距离表:

ABCDE
0∞∞∞∞

顶点库:【A】

在这里插入图片描述
处理顶点库中的顶点A:顶点A与B C相邻,它到另外两个节点的距离分别是-1,4均小于∞,故更新距离表,并将顶点B、C加入到顶点库中:
距离表

ABCDE
0-14∞∞

顶点库
【B,C】

处理顶点库中的顶点B:顶点B与C,D,E相邻,距离分别为3,2,2。由于A-B-C这条路径比A-C这条路径耗时短,故更新顶点C的距离表,同时更新顶点D和E在距离表中的数据,并将顶点D、E加入到顶点库:
距离表

ABCDE
0-1211

顶点库
【C、D、E】

处理顶点库中的顶点C:发现C没有通向其他顶点;
更新顶点库为:【D、E】

处理顶点库的顶点D:顶点D通向顶点C,但是对于C来说,经过D的路径比不经过D的路径要费时,所以不做处理;
更新顶点库为:【E】

处理顶点库的顶点E:E通向顶点D,且可以将顶点D的路径成本降低为-2,故更新距离表,并将具有新路径成本的顶点D加入到顶点库中:
路径表:

ABCDE
0-12-21

顶点库:
【D】

处理顶点库中的订点D:D通向B和C,但是不能将B和C的路径成本进一步降低了,故路径表不更新,同时顶点库中没有其他顶点了,结束整个过程。

JAVA实现

输入:
int[][] weights:二维数组,表示起点、终点及对应的路径权重,例如:

int[][] weights= {
				{2,1,1},
				{2,3,1},
				{3,4,1}
		};

表示下面这个图:

N:表示节点的个数,上面这个图的N为4
K:表示起点

输出:
int[] path:从节点K出发,到其他所有节点的最短路径数组。
例如对于上面的图来说,起点为节点2时,输出的path为:

01234
01012
class Solution {
    public int[] bellmanFord(int[][] weights, int N, int K) {
    	// 由路径权重数组重构这个图
    	int[][] graph = new int[N+1][N+1];
    	for(int i=0;i<N+1;i++)
    	// graph中的路径权重为-1时表示该边不存在
    	Arrays.fill(graph[i], -1);
        
        for(int[] w: weights) 
        	graph[w[0]][w[1]] =w[2];
      
      // path[i]表示第K到第i个节点时间
      int[] path=new int[N+1];
      // 初始时,默认起点到起点的时间为0;起点到其他节点的时间为无穷大
      Arrays.fill(path, Integer.MAX_VALUE);
      path[K] = 0;
      
      // nodes保存等待处理的节点
      Queue<Integer> nodes= new LinkedList<>();
      nodes.offer(K);
      
      while(nodes.size()>0) {
    	  int curNode= nodes.poll();
    	  for(int i=1;i<=N;i++) {
    		  if(i==curNode||graph[curNode][i]==-1)	continue;
    		  int curPath = path[curNode]+graph[curNode][i];
    		  if(curPath<path[i]) {
    			  nodes.offer(i);
    			  path[i] = curPath;
    		  }
    	  }
      }
      return path;
    }
}
例题

leetcode743
解法

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

相关推荐

图论中的重要算法(Dijstra,Bellman-Ford,Floyd,Ford-Fulkerson,匈牙利算法)的详细解读及实现

生活中处处有图,最典型的就是地图了,我们需要了解到一个地方的最短距离或者最短时间是多少。还有比如自来水管道所构成的图,我们需要知道如何通水使水流量最大而不会使管道破裂。图论中的一些算法就是来解决这一类问题的,这些算法对人们生活生产的重要程度不只是在编程中体现的。

分享学习的知识,记录我的技术成长道路 3762

Bellman-ford算法图解

介绍 与Dijkstra算法不同,Bellman-ford能对付有负权重的边,而且可以检测negative cycle. 假设V存的是所有的顶点(vertex),E存的是所有的边(edge),w(u, v)代表顶点u到顶点v的权重,PI[v]存的是从哪一个顶点到顶点v(PI[A]=s表示s->A) 以这幅图为例子。 伪代码 初始化 伪代码 for v in V: d[v]=INFINITY PI[v]='' d[s]=0 循环 for i in range(1, len(V)): #

skywuuu的博客 6904

《惠普工作站设置BIOS从U盘装系统》

惠普工作站设置BIOS 惠普工作站在做服务器时应用广泛,本文介绍下其BIOS开机自启动设置,附上图片,以供学习参考。 惠普工作站设置BIOS 启动步骤如下: 第一步:根据需要对BIOS进行更改,并保存 1.重启工作站按F10进入BIOS设置(也可以按ESC键选择进入BIOS设置的选项)。 图1 惠普工作站B...

istrangeboy&begin zero的博客 2万+

最短路问题 Bellman-Ford(单源最短路径)(图解)

最短路问题 Bellman-Ford 单源最短路径 图解

m0_63658130的博客 8396

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 435

用Multisim仿真一个9V供电的双工对讲机:从电桥原理到LM1875功放调试全记录

本文详细介绍了使用Multisim仿真9V供电的双工对讲机全过程,涵盖电桥原理、NE5532前置放大设计、LM1875功放调试及双工通信实现。通过实战案例解析,帮助读者掌握模拟电路设计与调试技巧,提升电子工程实践能力。

weixin_28678831的博客 115

图的搜索算法:Dijkstra 算法、Bellman-Ford 算法、Floyd-Warshall 算法

图的搜索算法:Dijkstra 算法、Bellman-Ford 算法、Floyd-Warshall 算法 这里也比较麻,有基础的看一看😭

xhc6666的博客 1103

Word中 Go to endnote 出现闪退问题解决办法

Word中 Go to endnote 出现闪退问题解决办法

努力努力努力 1万+

Bellman-Ford算法深度解析

Bellman-Ford 算法由 Richard Bellman 和 Lester Ford 在 20 世纪 50 年代提出,用于计算带权有向图中一个源点到其他所有节点的最短路径。该算法的核心思想是通过**迭代松弛(relaxation)** 操作,逐步逼近最短路径。与 Dijkstra 算法不同,Bellman-Ford 算法可以处理负权边,甚至能够检测图中是否存在负权回路(若存在负权回路,则不存在最短路径)

1312

浅谈天线 - - - GNSS/BT/4G/2.4G

全球定位导航系统,最成熟的就是美利坚,我大中华,俄罗斯,还有就是欧洲的一个(太次不谈)所以我们在项目调试的时候,小尺寸的陶瓷天线上一般兼容2个频段,体积大一点的可以兼容三个频段,采用组合的形式 GPS+BD GPS+GLONASS GLONASS+BD 或者是单频段的定位天线陶瓷PATC陶瓷片:陶瓷片面积越大,介电常数越大,其共振频率越高,接收效果越高,这就是为什么都推荐使用大一点的陶瓷天线的原因银层:陶瓷天线表面的银层可以影响天线的共振频率,理想的GNSS陶瓷片频点准确落在1575.42MH

BLACKHOLE6的博客 1万+

垂直领域论坛数据挖掘:Python突破Discuz!加密与用户画像构建指南

在垂直领域论坛,如专业技术论坛、兴趣爱好社区等,积累了大量有价值的信息和用户数据。这些数据不仅可以帮助我们了解用户的行为模式和兴趣点,还能为社区运营、产品优化、商业决策等提供有力支持。然而,许多基于Discuz!系统的论坛对数据进行了加密保护,给数据挖掘带来了一定的挑战。本文将详细探讨如何使用Python突破Discuz!论坛的加密机制,并构建用户画像,实现数据掘金。

u014481728的博客 1693

【算法设计与分析】最短路径dijkstra算法和bellman-ford算法

文章目录一、实验内容1、 Dijkstra算法求最短路径。2、Bellman-ford算法求最短路径二、理论准备1、 Dijkstra算法2、bellman-ford算法3、 两个算法的使用环境。三、实验环境四、实验过程1、Dijkstra算法2、bellman-ford算法五、实验结果六、实验总结 实验代码(github) 一、实验内容 1、 Dijkstra算法求最短路径。 测试用图 预期...

最简示例破局!基础用法秒会,深层原理不绕弯。 4588

由浅入深的详细解读汽车PDU与BDU

本文详细解读新能源汽车的PDU高压配电单元和BDU电池包断路单元,涉及电气件参数设计、选型、结构设计、电气安全、散热设计、继电器控制与诊断,提供汽车电子知识和技术解析。

让你爱上电路设计 1万+

Bellman_Ford 算法

 Bellman-ford算法是求含负权图的单源最短路径算法,效率很低,但代码很容易写。即进行不停地松弛(原文是这么写的,为什么要叫松弛,争议很大),每次松弛把每条边都更新一下,若n-1次松弛后还能更新,则说明图中有负环,无法得出结果,否则就成功完成。Bellman-ford算法有一个小优化:每次松弛先设一个标识flag,初值为FALSE,若有边更新则赋值为TRUE,最终如果还是FALSE则

思维迷宫 471

YOLOv11改进策略【Neck】| 替换RT-DETR中的CCFF跨尺度特征融合颈部结构,优化计算瓶颈与冗余问题

RT-DETR中的CCFF模块用于优化多尺度特征融合,解决传统方法的计算瓶颈与冗余问题,提升模型速度与精度,以适应实时检测需求。

Limiiiing的博客 1830

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

关于SPFA Bellman-Ford Dijkstra Floyd BFS最短路的共同点与区别

关于模板什么的还有算法的具体介绍 戳我这里我们只做所有最短路的具体分析。 那么同是求解最短路,这些算法到底有什么区别和联系: 对于BFS来说,他没有松弛操作,他的理论思想是从每一点做树形便利,那么时间复杂度绝对是在大型图中难以接受的,所以BFS题目设计很精巧,数据限制,更重要的是他可以处理一些条件很麻烦的联通情况,比如在途中,每步长相同求到达某一地的时间,那么我们要用最短路,就需要建图,但是...

日拱一卒,功不唐捐 2901

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

路由算法学习( Dijkstra 算法 Bellman-Ford方程算法)

由网络管理员手工配置路由信息。维度链路状态 (LS) / Dijkstra距离向量 (DV) / Bellman-Ford信息视野全局地图 (Global Map)局部路标 (Local Signpost)计算位置每个节点独立计算全网路径分布式协作,迭代逼近消息传递泛洪 (Flooding) 给全网仅发送给直连邻居收敛速度快,确定性高慢,可能存在临时环路鲁棒性路由器可独立验证信息,较难被错误信息误导容易传播错误的路由信息 ("谣言"传播)资源消耗内存和 CPU 消耗较大 (需存全图)

weixin_51832012的博客 717

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法复习——图算法篇之单源最短路径之Bellman-Ford算法

算法复习——图算法篇之单源最短路径之Bellman-Ford算法 以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习! 1. 问题背景 ​ 在计算带权图中源点到所有其他顶点的最短路径时,如果图中存在负权边,Dijkstra算法不再适用。 ​ 那么图中存在负权边时,是否存在单源最短路径? ​ 如果源点sss可达负环,则难以定义最短路径。因为可以绕负环,不断松弛到−∞-∞−∞。 ​ 若源点sss无可达负环,则存在源点sss的单源最短路径。 2. 问题定义 单源最短路径

NickHan_cs的博客 384

算法学习笔记:Bellman-Ford算法 单源最短路

Bellman-Ford算法 解决单源最短路    最短路是图问题中常见的一种问题,最短路也分很多种类。之前在写题的时候接触到Dijkstra算法。但是后来接触到更多单源最短路问题后发现,Dijkstra算法虽然有优于Bellman-Ford算法的时间复杂度,但是舍弃对负权回路的检测。而Bellman-Ford算法可以检测到负权回路,这个时候程序就会返回值提示含有负权回路,此时不存在最短路。

Hermit_Inwind的博客 957

算法分析与设计——贪心法实验报告

算法导论 课程设计 成 绩 题 目:贪心法 学院班级:1613013 学 号:16130130216 姓 名:库 妍 主讲教师:...

weixin_33743880的博客 3572

Layout问题(bellman-ford算法)

代码:《挑战程序设计竞赛》2.5.6 #include<iostream> #include<algorithm> using namespace std; #define MAX_N 10000 #define INF 10000 int N, ML, MD; //N为牛的个数 int AL[MAX_N], BL[MAX_N], DL[MAX_N]; //关系好的牛 int AD[MAX_N], BD[MAX_N], DD[MAX_N]; //关系不好的牛 int d[MA

pp2373886592的博客 300

最短路bellman-ford算法)B - 畅通工程续

B - 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路。不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要

qz13110802018的专栏 746

图解Bellman-ford算法

原文地址:http://www.java3z.com/cwbwebhome/article/article1/1359.html?id=4720 作者:cwb  一、Bellman-Ford算法:      为了能够求解边上带有负值的单源最短路径问题,Bellman(贝尔曼)和Ford(福特)提出了从源点逐次绕过其他顶点,以缩短到达终点的最短路径长度的方法。     Bellman-f

山鸡哥的专栏 6201

Wormholes——Bellman-Ford判断负环

【题目描述】 While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time...

T_T233333333的博客 347

多源最短路径算法:Floyd-Warshall算法分析

多源最短路径算法

小青菜的博客 1150

bellman-ford算法

以下是参考的大牛的,可以说是duhoug

Lola&France 663
上一篇: 【leetcode】743. Network Delay Time
下一篇: 【算法设计与分析】图:Djikstra算法
AXIMI
博客等级 码龄10年 53粉丝 455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值