c++ Bellman-Ford算法的具体实现

 更新时间:2021年06月28日 15:20:46   作者:即使敌众我寡  
Bellman-Ford算法用于解决有边数限制的最短路问题,且可以应对有负边权的图,本文主要介绍了c++ Bellman-Ford算法的具体实现,感兴趣的可以了解一下

Bellman-Ford算法用于解决有边数限制的最短路问题,且可以应对有负边权的图

其时间复杂度为O(nm),效率较低

代码实现:

#include<iostream>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e4+10;
const int M=510;
int m,n,k,dis[M],backup[M];
//m条边,n个点,在1号点到n号点之间找到一条经过小于等于k条边的通路
//dis:各点到源点的距离,backup:备份 
struct Node
{
	int x,y,v;
}edge[N];//可以直接用结构体存边 
int Bellman_Ford()
{
    dis[1]=0;
	memset(dis,0x3f,sizeof dis);
	for(int i=1;i<=k;i++)
	{
		memcpy(backup,dis,sizeof dis);
		for(int j=1;j<=m;j++)
		{
			Node t=edge[j];
			dis[t.y]=min(dis[t.y],backup[t.x]+t.v);
		}
	}
	if(dis[n]>inf/2)	return -1; 
	return dis[n];
}
int main()
{
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		edge[i]={a,b,c};
	}
	int ans=Bellman_Ford();
	if(ans==-1)		cout<<"impossible";
	else			cout<<ans;
	return 0;
 } 

对代码中的重难点的解释:

1.backup备份数组存在的意义:每一次“迭代”后,实现对dis数组的当前状态进行保存

这里详细解释一下“迭代”的含义:此处的迭代即为从源点开始,对所到达的点的出边进行松弛

举个例子:有一个如下的图,1号点为源点

第一次迭代

找到2,3号点到源点的最短距离

第二次迭代

找到4,5号点到源点的最短距离

第三次迭代

由于所有边都已被遍历,没有边能够被松弛,迭代结束

由刚才的过程可知,每一次迭代后要对dis数组进行备份,若一直使用dis数组进行运算,程序则会失去迭代的控制(在代码中迭代体现为Bellman-Ford函数中的外重循环,题目要求最多经过k条边,实际上就是最多有k次迭代)

2.代码的最后的判断

为什么是if(dis[n]>inf/2),而不是if(dis[n]==inf)呢?

原因是Bellman-Ford算法可能处理含负权边的图,dis[n]可能会出现+∞-2这样的数值,所以进行大小比较判断时条件只需要让dis[n]大于一个同数量级的数(此处为inf/2)即可

到此这篇关于c++ Bellman-Ford算法的具体实现的文章就介绍到这了,更多相关c++ Bellman-Ford内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • 基于matlab MFCC+GMM的安全事件声学检测系统

    基于matlab MFCC+GMM的安全事件声学检测系统

    这篇文章主要为大家介绍了基于matlab MFCC+GMM的安全事件声学检测系统实现及源码示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-02-02
  • Linux中使用C语言的fork()函数创建子进程的实例教程

    Linux中使用C语言的fork()函数创建子进程的实例教程

    fork是一个在Linux系统环境下专有的函数,现有的进程调用fork后将会创建一个新的进程,这里我们就来看一下Linux中使用C语言的fork()函数创建子进程的实例教程
    2016-06-06
  • Qt5.9.5 随机转盘小项目的实现示例

    Qt5.9.5 随机转盘小项目的实现示例

    本文主要介绍了Qt5.9.5随机转盘小项目的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C++构造函数初始化顺序详解

    C++构造函数初始化顺序详解

    这篇文章主要介绍了C++构造函数初始化顺序详解,是对C++代码的运行机制深入探讨,需要的朋友可以参考下
    2014-10-10
  • C/C++使用fmt库实现格式化字符串

    C/C++使用fmt库实现格式化字符串

    fmt库是一个高效、易用的C++格式化库,可以帮助我们方便地进行字符串格式化、输出、日志记录等操作,下面我们就来学习一下fmt格式化字符串的具体操作吧
    2023-12-12
  • Qt图形图像开发之曲线图模块QCustomplot库生成静态、动态曲线详细教程图解

    Qt图形图像开发之曲线图模块QCustomplot库生成静态、动态曲线详细教程图解

    这篇文章主要介绍了Qt图形图像开发之曲线图模块QCustomplot库画静态、动态曲线详细教程图解,需要的朋友可以参考下
    2020-03-03
  • C/C++实现词法分析程序的示例代码

    C/C++实现词法分析程序的示例代码

    这篇文章主要为大家详细介绍了如何基于C/C++实现一个简单的词法分析程序,并通过完成词法分析程序,了解词法分析的过程,感兴趣的小伙伴可以跟随小编一起学习学习
    2023-05-05
  • C++语言io流处理基本操作教程示例

    C++语言io流处理基本操作教程示例

    这篇文章主要为大家介绍了C++语言io流处理的基本操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • C语言深入讲解指针与结构体的使用

    C语言深入讲解指针与结构体的使用

    指针提供了对地址操作的一种方法,因此,使用指针可使得C语言能够更高效地实现对计算机底层硬件的操作。另外,通过指针可以更便捷地操作数组。C数组允许定义可存储相同类型数据项的变量,结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项
    2022-05-05

最新评论