Bellman_ford算法

最短路径算法有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的值无意义。

下面是其代码:

</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值