首页 > 编程语言 > bellman-ford算法理解

bellman-ford算法理解

时间:2023-07-21 10:36:31浏览次数:39  
标签:int 短路 bellman ford 负环 算法 include

bellman-ford算法理解

从本题谈起再回归到最短路。本题为限制边数的最短路,是这个算法优势领域的题目。为什么它能解决?

  • 最外层每循坏一次,就是各点向外走一条边,内层对边的遍历是对所有边进行松弛操作,每次进行该操作时,需要用到备份数组,目的是防止连锁反应,保证每次每个点到起点的距离只能因为上一轮的更新而更新。

若只是求最短路,则外层循坏n-1次。为什么是n-1?

  1. 假如最短路存在,认为没有负环
    从上面算法理解可以知道,外层n-1次相当于起点已经走过了n-1条边(bfs到n-1层
    那么从最坏情况考虑,由于已经假设最短路存在,那么其长度应该<=n-1.
  2. 假如最短路不存在
    而如果n-1条边还没有更新到d[n],即没有找到一条长度<=n-1的路径从1能到n,说明n可能和1不连通或者图中存在负环

bellmanFord也能判负环,但效率没有spfa好,如何判定呢?

  • 外层循坏n-1次后,如果再进行循环松弛操作依然还能发生有效作用(即被成功更新),说明图中存在一条长度为n的路径,而只有n个点,根据抽屉原理,路径上有两个点是同一个点,存在环,而既然我们一直构造的路径是最短路,既然构造出来有环,就说明在没有其他限制的条件下当前从环走可以减小路程,所以判断这个环是负环

代码实现过程tip

  1. 注意初始化d[1]=0;
  2. 用于需要遍历所有边,而每次并不是找点然后拓展这个点得的出边,所以使用结构体储存边是一个刚需

算法最难理解的有两个点

  1. 需要一个备份数组,保留上次的d数组数据,防止其利用上次的d数组
  2. 最终判断时并不是判断是不是等于0x3f3f3f3f,而是比这个数小一点的数,因为bf算法会更新所有边,即使到不了,也可能因为有负环或者负边权而减小,因为bellmanford是无脑遍历所有边
#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=510;
int d[N],l[N];
typedef long long ll;
struct edge{
	int a,b,c;
}e[20010];

	

int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=m;i++){
	int a,b,c;
	cin>>a>>b>>c;
	e[i]={a,b,c};
	}

		memset(d,0x3f,sizeof d);
		d[1]=0;
	for(int i=0;i<k;i++){
		memcpy(l,d,sizeof d);
		for(int j=1;j<=m;j++){ 
			auto u=e[j];
			d[u.b]=min(d[u.b],l[u.a]+u.c);
		}
	}
	if(d[n]>0x3f3f3f3f/2)cout<<"impossible";
	else cout<<d[n];

	
	
	
	
	
	return 0;

}

标签:int,短路,bellman,ford,负环,算法,include
From: https://www.cnblogs.com/mathiter/p/17570611.html

相关文章

  • LntonCEC算法算力云平台服务通过EasyNTS内网穿透到公网上的具体操作流程
    算法算力云平台的主要特点包括高性能、高可靠性、高可扩展性和低成本。LntonCEC算法算力云平台是一种为用户提供高效、强大的算法计算服务的云计算平台。它可以帮助用户快速、灵活地运行各种复杂的计算模型和算法,包括机器学习、人工智能、大数据分析、图像识别等领域。算法算力云平......
  • 揭秘绿幕抠图算法技术
     绿幕抠图为什么是“绿幕”呢?人眼的感光系统和摄像机的感光芯片采集的色彩中,最常见的就是红、蓝、绿三原色。红色在演员服饰和物体中较为常见,不利于背景分离;绿色则是人体肤色最少的颜色,人眼对绿色最为敏感,而相机也是模仿人眼的设计,CMOS采集信息是按照RGGB,其信号最强、噪波最少......
  • 遗传算法 深度学习
    遗传算法与深度学习1.遗传算法和深度学习的概述遗传算法和深度学习是两种不同的优化算法,它们在解决问题时有着不同的应用场景和方法。遗传算法是一种通过模拟生物进化过程中的自然选择和遗传机制来寻找最优解的优化算法。而深度学习则是一种通过神经网络模型来学习和识别复杂的......
  • 每日算法之四十六:Add Binary(二进制字符创相加)
    二进制字符创相加,通过进位的方式逐位考虑。也可以把相加的过程抽象成一个函数。Giventwobinarystrings,returntheirsum(alsoabinarystring).Forexample,a= "11"b= "1"Return "100".方法一:classSolution{public:stringaddBinary(stringa,string......
  • 每日算法之四十:Insert Interval
    Givenasetof non-overlappingYoumayassumethattheintervalswereinitiallysortedaccordingtotheirstarttimes.Example1:Givenintervals [1,3],[6,9],insertandmerge [2,5] inas [1,5],[6,9].Example2:Given [1,2],[3,5],[6,7],[8,10],[12,16],inser......
  • 上班摸鱼刷算法-Java-hot100-[160]相交链表
    publicclassSolution{publicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){if(headA==null||headB==null){returnnull;}ListNodepA=headA;ListNodepB=headB;while(pA......
  • 上班摸鱼刷算法-Java-hot100-[21]合并两个有序链表
    //将一个链表插入到另一个链表中classSolution{publicListNodemergeTwoLists(ListNodelist1,ListNodelist2){if(list1==null){returnlist2;}if(list2==null){returnlist1;}retur......
  • java十大算法
    Java十大算法Java是一门广泛应用于大量软件开发领域的编程语言。在Java的生态系统中,有许多重要的算法和数据结构,这些算法和数据结构在各个领域中被广泛使用。在本文中,我们将介绍Java中的十大算法,并通过代码示例来解释它们的工作原理。1.排序算法排序算法是计算机科学中最基本和......
  • 6大常用基础算法
    6大常用基础算法1冒泡排序(BubbleSort)基本思想两个数比较大小,比较大的数下沉,比较小的数冒起来。时间复杂度O(n)2代码```inta[]={15,4,3,2,8,0,7};intlength=sizeof(a)/size(a[0]);voidasd(inta[],intlength){inttemp;for(inti=0;i<length-1;i++){......
  • 装饰器/递归/算法
    多层装饰"""语法糖会将紧挨着的被装饰对象的名字当做参数自动传入装饰器函数中"""#判断七句print执行顺序defoutter1(func1):print('加载了outter1')打印顺序③和前面的定义对应defwrapper1(*args,**kwargs):print('执行了wrapper1')打印顺序④......