关于Bellman-Ford算法的理解

这篇博客写废了,以后改。2017.4.9

Bellman-Ford算法,对于一个有向图,可以分别求出图中所有点到一个确定点的最短距离。

基本思想就是枚举每一个点,判断通过该边能否使得其起点到原点的距离变短。

如:

 关于Bellman-Ford算法的理解_第1张图片

对于边3-2,它可以使3-1变成3-2-1,从而使其距离变短,此过程称为松弛。(松弛点数,拉紧距离)

 

3-2可以松弛的条件:

1.3-2存在。(对于核心代码来说,枚举所有边就已经保证了其存在,否则将不可能被枚举出来)

2.2-1存在。(对于核心代码,实际实现的时候,2-1的距离设为的为Inf,即一个很大的数。)

3.3-2权值+边2-1权值<边3-1权值。(判断语句实现)

 

关于条件2用核心代码实现的时候会出现的问题:

 关于Bellman-Ford算法的理解_第2张图片

对于此图例子,若以1为目标点,在进行松弛的时候,若按照把dis[i]赋值为Inf的方法来实现的话。在第一次松弛也就是判断边3-2是否可以缩短起点3到原点1的距离的过程中,本不应该松弛的,但由于dis[3]>dis[2]-1,会进行一次松弛。

但发现此时dis[1]=0,dis[2]=inf,dis[3]=inf-1。已经不能再次松弛,所以对于判断该图是否存在负权回路的时候,不会造成影响。也可以看成是,第一次松弛已经把过程3-2-1封装成3-1。

 

注意:

1.关于代码实现注意,目标点到自己的距离一定要提前赋值成0。

2.枚举的应该是每一条边,而不是每一对点,不然太慢。

3.另外,当用该算法判断是否存在负权回路的时候,并不必要把目标点到自己的距离赋值成0。

4.对于无负权环图,循环(点数-1)次就可以求得所有点的最短路。最坏的情况就是以目标点为头的一连串链,每次确定一个,最后需要确定n-1次嘛。

 

算法用途扩展:

1.既然可以求图中所有的点到目标点的最短距离,也就可以求目标点到图中所有的点的最短距离。

2.对于无向图,也同样可以实现,只不过是把每条边反过来再枚举一次。

3.既然可以求任意点和目标点之间的最短距离,也就可以求目标点和任意点之间的最长距离。判断条件只要变成<就可以了。同样此时也可以判断是否存在正权回路。

 

证明第二次循环那n-1次出现可松弛边为图中有负权回路的充分必要条件:

充分性:

必要性:

未完待续~

 

 

你可能感兴趣的:(最短路径)