经典算法之图的最短路径(二):Bellman_Ford算法

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

Bellman_Ford算法也是一个求图的最短路径的非常经典的算法,它适用于求单源最短路径,相比于同样用于单源最短路径的Dijkstra算法,它的适用范围更广,它可以用于有向图和无向图,并且权值可以为负,如果存在负权回路,可输出提示。

算法的流程就是:每次遍历图中所有边进行松弛(所谓的松弛是这样的——比如说存在一条边e(u,v),权值为w(u,v),如果d(v)>d(u)+w(u,v),则让d(v)=d(u)+w(u,v)),共遍历松弛V-1次(V是点的个数),此时如果不存在负权回路的话,d[i]就是源点到点i 的最短路径,因此再进行一次遍历,查看是否存在d(v)>d(u)+w(u,v),若存在,说明有负权值回路。下面上代码:(同样是偷懒没有正向打印路径)

package classic;

import java.util.Scanner;

public class Bellman_Ford {

	static int start = 0, V = 0, E = 0;
	static int[][] G = null;
	static int[] d = null, pre = null;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("输入点和边的数目:");
		V = sc.nextInt();//总共有多少个点
		E = sc.nextInt();//总共有多少个边
		
		G = new int[V][V];//用来存放图的信息
		d = new int[V];//用来存放从起点到每个点的最短路径长度
		pre = new int[V];//用来存放每个点在其最短路径上的前一个结点
		
		for(int x=0; x<V; x++){
			for(int y=0; y<V; y++){
				G[x][y] = Integer.MIN_VALUE;
			}
		}
		System.out.println("依次输入每条边的起点、终点和权值:(点的编号从0开始)");
		for(int i=0; i<E; i++){//初始化图
			int u = sc.nextInt();
			int v = sc.nextInt();
			int value = sc.nextInt();
			G[u][v] = value;
			G[v][u] = value;//注意:假如为有向图,则不加这一行!!
		}
		for(int i=0; i<V; i++){//初始化d
			if(i==start)
				d[i] = 0;
			else
				d[i] = Integer.MAX_VALUE/2;
		}
		
		if(!bellman_ford())
			System.out.println("图中存在负权值环");
		else{//打印
			for(int i=0; i<V; i++){
				System.out.println("起点"+start+"到点"+i+"的最短路径长度为:"+d[i]);
				System.out.println("最短路径为:");
				int curv = i;
				System.out.print(i+"<-");
				while(true){
					curv = pre[curv];
					if(curv == start)
						break;
					System.out.print(curv+"<-");
				}
				System.out.println(start);
			}
		}
		sc.close();
	}
	
	static boolean bellman_ford(){
		for(int i=1; i<V; i++){//对每条边都松弛V-1次
			for(int x=0; x<V; x++){
				for(int y=0; y<V; y++){
					if(G[x][y]>Integer.MIN_VALUE){//说明有边
						if(d[y]>d[x]+G[x][y]){
							d[y] = d[x]+G[x][y];
							pre[y] = x;
						}
					}
				}
			}
		}
		for(int x=0; x<V; x++){
			for(int y=0; y<V; y++){
				if(G[x][y]>Integer.MIN_VALUE){//说明有边
					if(d[y]>d[x]+G[x][y]){
						return false;
					}
				}
			}
		}
		return true;
	}

}

图的最短路径:Floyd、DisjKstra、Bellman-Ford、SPFA算法 问题描述: 给定一个有向图的邻接矩阵graph,graph[i][j]表示点i到点j的路径长,我们需要对图进行稀疏,将graph[i][j]转换为点i到点j的最短路径长。 图的稀疏是图中比较经典的问题,常见的算法有Floyd、DisjKstra、SPFA算法,下面将进行详述。 一、Floyd算法\color{blue}{Floyd算法}Floyd算法 Floyd-Warshall算法(Floyd-... 阅读详情

相关推荐

算法——单源最短路径:Bellman-Ford算法、Dijkstra算法

前言 在最短路径问题中,约定

关注校招求职,微信号:job_campus 3282

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

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

m0_63658130的博客 8397

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

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

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

算法(五):图解贝尔曼-福特算法

算法简介 贝尔曼-福特算法(Bellman–Ford algorithm )用于计算出起点到各个节点的最短距离,支持存在负权重的情况 它的原理是对图进行最多V-1次松弛操作,得到所有可能的最短路径。其优于迪科斯彻算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高,高达O(VE)。但算法可以进行若干种优化,提高了效率。 Bellman Ford算法每次对所有的边进行松弛,每次松弛...

weixin_34187822的博客 4370

bellman-ford算法及例题讲解

分步介绍了bellman-ford算法的详细步骤和分析方法,最后给出了例题进行了说明

图解Bellman-Ford算法

NULL 博文链接:https://128kj.iteye.com/blog/1715073

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的博客 6906

NSFC结题报告下载脚本失效?3步教你手动修复下载按钮问题(2024最新版)

针对NSFC官网域名变更导致结题报告下载脚本失效的问题,本文提供了详细的手动修复指南。通过三步操作,教你如何修改用户脚本的域名匹配规则,恢复下载按钮功能,确保NSFC结题报告下载器能继续高效工作。

vscode6remote的博客 751

图解 Dijkstra、Floyd、BellMan-Ford 最短路径算法

图解 Dijkstra Floyd BellMan-Ford 最短路径算法

weixin_54383080的博客 5720

高通Camera IFE时钟配置

高通Camera IFE时钟配置中的minHorizontalBlanking和minVerticalBlanking配置计算方法

一个懒癌的驱动工程师的随笔分享 6168

【深度剖析】三一重工的数字化转型(中篇)

三一重工在数字化转型方面取得了提高效率、降低成本、加强研发创新和改善内控管理等多方面的成效。本研究旨在通过对三一重工数字化转型的深入分析,引导企业思考在第四次工业革命与第三次能源革命交汇的超级技术窗口期,如何进一步把握发展机遇,并为同行业其他企业提供探索性的建议。作为装备制造行业的佼佼者,三一重工的数字化转型受到了业界的广泛关注。作为行业内首批接触并实践数字化转型的企业之一,三一重工的转型经验不仅成功,而且积累了丰富的理论与实践,为其他制造业企业的数字化转型提供了可借鉴的范例。

领信卓越的博客 2306

【图论】Bellman_Ford算法求有步数限制的最短路(图文详解)

一、前言 在之前的学习中,我们学习了用Dijkstra算法求有向图的最短路问题Dijkstra算法求最短路博客。但是在Djkstra算法中,我们认为可以走的步骤是无限的,但是在日常问题中,我们需要解决有步数限制的最短路问题,这个时候,我们就需要学习一个新的算法来解决这个问题----Bellman_Ford算法。虽然看上去又是一个高大上的算法,但其实这个算法的实现也并不是什么太难的事情。而且,它还能处理边的长度为负数的情况。 二、Bellman_Ford算法介绍 由于是有步数限制和负数边存在,我们不能使用Dj

qq_49688477的博客 2336

SOC-ATF 安全启动BL2流程分析(2)

Bl2的启动流程与bl1类似,主要区别是bl2的初始化流程比bl1更简单,但其可能需要加载更多的镜像,如bl31、bl32和bl33。由于bl2可以运行于el3或s-el1,它们的入口函数和处理流程都有所区别,为了简化分析我们选取比较常见的s-el1方式,以下为其总体执行流程:上图仅供参考,实际看一下代码结构:上面截图展示了 链接汇编文件,bl2_el3.ld.S 是指bl2 运行于el3;bl2.ld.S 是实现bl2运行于s-el1 .

z20230508的博客 1388

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

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

m0_72674633的博客 1685

GD32F103实战:用ADC+DMA实现高精度多通道电压采集与OLED实时显示(附完整工程)

本文详细介绍了如何利用GD32F103的ADC+DMA技术实现高精度多通道电压采集,并通过OLED实时显示数据。文章包含硬件架构设计、ADC配置技巧、DMA传输优化及显示系统实现方案,提供完整工程代码和调试指南,适用于工业传感器和环境监测设备开发。

weixin_42567497的博客 400

AI量化交易工作台Vibe-Trading:用自然语言驱动策略回测与多智能体研究

量化交易通过数学模型和计算机程序执行投资决策,其核心在于将市场规律转化为可验证的策略。传统量化开发涉及数据获取、策略编写、回测验证等复杂工程,对非编程背景的从业者构成较高门槛。随着大语言模型技术的发展,自然语言交互正成为降低技术使用难度的关键。Vibe-Trading项目正是这一趋势的实践,它将金融工程任务封装为可调用的工具与技能,允许用户通过自然语言指令直接驱动策略回测、因子研究和投资组合分析。其技术价值在于构建了一个模块化的AI Agent框架,通过ReAct推理框架协调多个专项技能,并创新性地引入多智

weixin_28695161的博客 1567

【经典算法】Bellman-Ford最短路径算法

单源最短路径 给定一个图,和一个源顶点src,找到从src到其它所有所有顶点的最短路径,图中可能含有负权值的边。 Dijksra的算法是一个贪婪算法,时间复杂度是O(VLogV)(使用最小堆)。但是迪杰斯特拉算法在有负权值边的图中不适用,Bellman-Ford适合这样的图。在网络路由中,该算法会被用作距离向量路由算法。 Bellman-Ford也比迪杰斯特拉算法更简单和同时也适用于分布式系

sms0101的专栏 3万+

【论文硬核拆解】Ctx2Skill:让大模型自己跟自己玩,从上下文里「进化」出可复用技能

论文选择自然语言技能可解释性:技能是人类可读的 Markdown 文件,可以审查、编辑、调试可迁移性:即插即用,从一个模型到另一个模型无需参数访问:对闭源模型友好这比 SKILL0/SkillRL 等参数内化方法更实用,尤其是在商业 API 场景。

步子哥的博客 154

【经典算法】最短路径算法——Bellman-Ford

最短路径算法是图论中一类重要算法,其功能就如名字一样——求解点与点之间最短距离。首先,先让我们对最短路径算法有一个概观,看看都有哪些种类的最短路径算法,每一个种类中代表的算法又是什么。从一个起点出发求解其到其他所有其他点的最短距离从所有点出发求解其到其他所有其他点的最短距离本文到这里就结束啦~~本篇文章的撰写花了本喵两个多小时知识来源:《算法导论》、山东大学孔凡玉老师ppt。不要用于商业用途转发哦~

十二月的猫 4346

低轨通信 | 手机直连低轨卫星通信:架构、关键技术与未来展望

手机直连低轨卫星通信正推动人类进入"全域连接"时代。当中国星网GW星座与千帆星座的万颗卫星点亮夜空,当普通智能手机在珠峰之巅仍能流畅视频通话,当远洋渔船通过卫星物联网实现精准捕捞——这些场景不仅重构通信产业格局,更将深刻改变人类生产生活方式。正如工信部《指导意见》所规划,到2030年我国将发展超千万卫星通信用户,催生万亿级新市场[1][5]。在这场太空基建竞赛中,技术创新与标准制定的双重突破,将决定未来数字文明的星空版图。

尘世冰封的专栏 938

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最短路径问题——Bellman-Ford算法

Bellman-Ford算法是一种解决单源最短路径问题的经典算法,特别适用于含负权边的图。该算法通过动态规划思想进行"松弛操作",最多进行n-1轮遍历即可得到最短路径。其主要优势在于能处理负权边和检测负权环,缺点是时间复杂度较高(O(VE))。算法实现简单,适用于稀疏图或需要检测负权环的场景,但针对无负权边的图时效率不如Dijkstra算法。核心过程包括初始化、多轮边遍历和权值更新,可通过提前中断循环优化性能。此外,该算法还可用于检测负权环,并可通过适当调整应用于无向图。

2303_79102751的博客 1810

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

轻松学懂图(下)——Dijkstra和Bellman-Ford算法

概述 ​ 在上一篇文章中讲述了Kruskal和Prim算法,用于得到最小生成树,今天将会介绍两种得到最短路径的算法——Dijlkstra和Bellman-Ford算法 Dijkstra算法 算法的特点: 属于单源最短路径算法,什么是单源呢,通俗的说也就是一个起点,该算法一次只能得到一个点到其他点的最短路径。 限制条件:图中不能有负权边。也就是图中不能有权值为负数的边 上面的特点在我讲完这个算法的思想之后你就会明白为什么了。 算法思想: 这个算法的思想其实特别贴近生活,如果你把每个点都想.

生命中有太多不确定 4507

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

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

【算法】Bellman-Ford单源最短路径算法(附动图)

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

Eristic0618的博客 6087

【最短路径】:Dijkstra算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法

求最短路径最常用的算法有: Dijkstra算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法。 Dijkstra算法、SPFA算法、Bellman-Ford算法这三个求单源最短路径,最后一个Floyd-Warshall算法可以求多源最短路径也可以求单源路径,效率比较低。 SPFA算法是Bellman算法的队列优化。 Dijkstra算法不能求带负权边的最短

柳婼 の blog 3591

Bellman-Ford算法详解:带限制的最短路径算法

详细介绍Bellman-Ford算法,并解释其检测负环的原理

Lostgreen的博客 1782

图的最短路径——-Dijkstra算法、Bellman-Ford算法

最短路径问题:从在带权有向图G中的某一顶点出发,找出一条通往另一顶点的最短路径,最短也就是 沿路径各边的权值总和达到最小。一、单源最短路径--Dijkstra算法1、概念单源最短路径问题:给定一个图G = ( V , E ) G=(V,E)G=(V,E),求源结点s ∈ V s∈Vs∈V到图 中每个结点v ∈ V v∈Vv∈V的最短路径。Dijkstra算法就适用于解决带权重的有向图上的单源最短 路径问题,同时算法要求图中所有边的权重非负。

2301_80687320的博客 989
上一篇: 经典算法之图的最短路径(一):Dijkstra算法
下一篇: 组合的两种递归算法
热血大婶
博客等级 码龄16年 58粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血大婶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值