BellmanFord BellmanFord算法

问题

设图G=<V,E>G = <V, E>中顶点v0v_0可以到达任意其他顶点vjv_j,用Bellman Ford算法求顶点v0v_0到其他所有顶点的最短距离。

解法

G(i,j)G(i, j)为两端点为顶点vi,vjv_i, v_j的边的距离,数组dist(i)dist(i)表示从顶点v0v_0viv_i的最短距离。

初始时,顶点v0v_0到自己的距离为0(即dist(0)=0dist(0) = 0),v0v_0到其他顶点的距离为无穷大;

dist(i)={0i=0+i0dist(i) = \begin{cases} 0 & i = 0 \\ + \infty & i \neq 0 \end{cases}

进行两层遍历,外层重复次数为点集的数量V|V|(外层重复V|V|次必然可以求出v0v_0到所有其他顶点的最短距离),内层遍历边集EE中的所有边ei,je_{i,j},设ei,je_{i,j}的两端点为vi,vjv_i, v_j。对顶点v0,vi,vjv_0, v_i, v_j进行松弛操作:

(1)(1)dist(j)>dist(i)+G(i,j)dist(j) \gt dist(i) + G(i, j),则更新距离dist(j)=dist(i)+G(i,j)dist(j) = dist(i) + G(i, j)

(2)(2)dist(i)>dist(j)+G(j,i)dist(i) \gt dist(j) + G(j, i),则更新距离dist(i)=dist(j)+G(j,i)dist(i) = dist(j) + G(j, i)

顶点v0v_0到任意其他顶点viv_i的最短距离为dist(i)dist(i)。若某个顶点的最短距离dist(i)<0dist(i) \lt 0,则说明该图不存在最短路径。

该算法时间复杂度为O(VE)O(\| V \| \cdot \| E \|)

Introduction To Algorithms

源码

BellmanFord.h

BellmanFord.cpp

测试

BellmanFordTest.cpp

Last updated