C++ 任意权值的单源最短路径(Bellman-Ford)

本文介绍了为什么在存在负权值的情况下不能使用Dijkstra算法,而需要采用Bellman-Ford算法来求解单源最短路径。通过示例解释了Bellman-Ford算法的基本思路,并提供了算法的实现过程。
摘要由CSDN通过智能技术生成

一、有Dijkstra算法求最短路径了,为什么还要用Bellman-Ford算法

        Dijkstra算法不适合用于带有负权值的有向图。

        如下图:

      用Dijkstra算法求顶点0到各个顶点的最短路径:

     (1)首先,把顶点0添加到已访问顶点集合S中,选取权值最小的邻边<0, 2>,权值为5

              记录顶点2的最短路径为:dist[2]=5, path[2]=0,把顶点2添加到集合S中。

              顶点2,没有邻边(从顶点2出发,其他顶点为终点的边),结束;

     (2)访问<0, 1>边,权值为7,把顶点7添加到顶点集合S中,dist[1]=7, path[1]=0。

             虽然,顶点1有邻边<1,2>,但是因为顶点2已在集合S中,所以,不继续修改,结束程序。

      所以,最终dist[1]=7,dist[2]=5。显然结果不对,顶点2的最短路径应为:0->1->2,权值为7+(-5)=2

 

二、Bellman-Ford算法思路:

       Bellman-Ford算法,效率低,但是适合用于求带有负权值的单源最短路径。

       不考虑有回路的,如下图,顶点0到顶点1的最短路径可以无穷小

     下面开始简单描述Bellman-Ford的思路:

   

    

可以,看到:通过绕过一些顶点,可以取得更短的路径长度

  当k=1时,即从源点(顶点0)到其他顶点,只需要一条边。有<0,1>、<0,2>、<0,3>,所以有:dist[1]=6,dist[2]=5,dist[3]=5;

  当k=2时,需要2条边的,u=1,有0->2->3,长度为:5+(-2)=3, 更短,所以要修改dist[1]=3;

           u=2,有:0->3->2,长度为:5+(-2)=3,更短,所以要修改dist[2]=3;

           u=3,没有两条边从顶点0到达顶点3的路径;

           u=4,有0->1->4,长度为:6+(-1)=5, 更短,所以要修改dist[4]=5;

           u=5,有0->3->5,长度为:5+(-1)=4,更短,所以要修改dist[5]=4;

           u=6,没有2条边就可以从顶点0到顶点6的路径。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值