图论---Bellman-Ford算法

适用场景:有边数限制 ->(有负环也就没影响了),存在负权边,O( n * m );

有负权回路时有的点距离会是负无穷,因此最短路存在的话就说明没有负权回路。

从1号点经过不超过k条边到每个点的距离。

若经过n次迭代,有更新的话(经过n+1个点了)就说明存在负环(一般不用其来求,用SPFA来判断负环)。

只有负环在1号点到n号点的路径上时,最短路才会不存在,在别的路上不影响。

有负环不会死循环,但是值可能会很小

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=510,M=10010;
int n,m,k;
int dist[N],backup[N];
struct edge{
	int a,b,w;
}edges[N];
int bellman_ford(){
	memset(dist,0x3f,sizeof dist);
	dist[1]=0;
	for(int i=0;i<k;++i){
		memcpy(backup,dist,sizeof dist);//每次更新时只用上一次更新的结果
		for(int j=0;j<m;++j){
			int a=edges[j].a,b=edges[j].b,w=edges[j].w;
			dist[b]=min(dist[b],backup[a]+w);
		}
	}
	if(dist[n]>0x3f3f3f3f / 2 ) return -1; //除2的原因是可能存在负权边
	return dist[n];
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=0;i<m;++i){
		int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
		edges[i]={a,b,w};
	}
	int t=bellman_ford();
	if(t==-1) puts("impossible");
	else printf("%d\n",t);
	return 0;
}
相关推荐
刚入坑的新人编程3 分钟前
暑期算法训练.11
数据结构·c++·算法·leetcode·链表
程序员编程指南5 分钟前
Qt 与物联网(IoT)开发
c语言·开发语言·c++·qt·物联网
hzhzh~7 分钟前
【C++】神秘-希尔排序
c++·希尔排序·排序·sort
秋风起,再归来~8 分钟前
C++从入门到起飞之——智能指针!
开发语言·c++·算法
十五年专注C++开发16 分钟前
MakeInstaller: 一款麒麟操作系统安装包制作工具
linux·c++·打包工具·安装包制作·麒麟系统
草莓熊Lotso17 分钟前
【数据结构初阶】--二叉树(六)
c语言·数据结构·经验分享·笔记·其他
lifallen1 小时前
Disruptor高性能基石:Sequence并发优化解析
java·数据结构·后端·算法
麦兜*1 小时前
【算法】十大排序算法超深度解析,从数学原理到汇编级优化,涵盖 15个核心维度
java·汇编·jvm·算法·spring cloud·ai·排序算法
重生之我是Java开发战士1 小时前
【C语言】深度剖析指针(三):回调机制、通用排序与数组指针逻辑
c语言·开发语言·算法
zjoy_22331 小时前
[算法]Leetcode3487
java·学习·算法·leetcode