问题
设图G=<V,E>中顶点v0可以到达任意其他顶点vj,用Bellman Ford算法求顶点v0到其他所有顶点的最短距离。
解法
设G(i,j)为两端点为顶点vi,vj的边的距离,数组dist(i)表示从顶点v0到vi的最短距离。
初始时,顶点v0到自己的距离为0(即dist(0)=0),v0到其他顶点的距离为无穷大;
dist(i)={0+∞i=0i=0 进行两层遍历,外层重复次数为点集的数量∣V∣(外层重复∣V∣次必然可以求出v0到所有其他顶点的最短距离),内层遍历边集E中的所有边ei,j,设ei,j的两端点为vi,vj。对顶点v0,vi,vj进行松弛操作:
(1) 若dist(j)>dist(i)+G(i,j),则更新距离dist(j)=dist(i)+G(i,j);
(2) 若dist(i)>dist(j)+G(j,i),则更新距离dist(i)=dist(j)+G(j,i);
顶点v0到任意其他顶点vi的最短距离为dist(i)。若某个顶点的最短距离dist(i)<0,则说明该图不存在最短路径。
该算法时间复杂度为O(∥V∥⋅∥E∥)。
Introduction To Algorithms
源码
BellmanFord.h
BellmanFord.cpp
测试
BellmanFordTest.cpp