Bellman_ford算法

Bellman-Ford算法主要用于解决含有负权边的单源最短路径问题,它可以在有向图或无向图中运行。尽管Dijkstra算法在边权重为非负时更为高效,但Bellman-Ford算法的优势在于能够处理负权重,不过必须确保图中不存在负权环。算法通过松弛操作迭代更新节点距离,经过n-1轮迭代后检查是否存在负权环。如果找到负权环,则表示最短路径计算失败,否则可以得到源点到所有其他节点的最短路径信息。
摘要由CSDN通过智能技术生成

最短路径算法有Dijkstra算法和floyd算法,分别求单源最短路径问题和多源路径问题,但Dijkstra有一个限制:边不能为负值。而Bellman_ford算法就是用来解决这个问题的。它可以允许边为负值的情况,所以相对于Dijkstra算法使用面要更广。

Bellman_ford算法的使用条件:

1)单源最短路径问题

2)有向图&无向图(可以看成有向图)

3)可以有负权边,但不能有负权环,如有则输出错误信息

4)差分约束系统

Bellman_ford算法的基本步骤如下:

1)初始化,将dis数组初始为无穷大,将pre数组初始化为一个无意义的数nil,并置dis[s]=0;pre[s]=s;s为源点。

2)对于每一条边,进行松弛操作。若dis[v]>dis[u]+value[u][v],则将dis[v]的值置为dis[u]+value[u][v]。

3)步骤2)循环nodenum-1次,其中nodenum为图中的顶点个数。

4)进行检查,判断是否存在负权环,对于每条边,判断是否有dis[v]>dis[u]+value[u][v]成立,若有则说明存在负权边,给出错误信息。否则没有,成功求得最短路径。

算法结束。这样以后,dis[u]表示源点s到u的最短距离,若为无穷大则说明两点之间不可达,pre[u]表示源点到u的最短路径中u之前的一个顶点。相应的若dis[u]的值为无穷大,则pre的值无意义。

下面是其代码:

</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值