问题
假设图G=<V,E>中顶点v0可以到达任意其他顶点vj,用Dijkstra算法求顶点v0到其他所有顶点的最短距离。
解法
设G(i,j)为顶点vi到vj的边的距离,数组dist(i)表示从顶点v0到vi的最短距离。
初始时,顶点v0到自己的距离为0(即dist(0)=0),v0到其他顶点的距离为无穷大;
dist(i)={0+∞i=0i=0 类似BFS算法,初始时将v0加入队列queue中并染红。当queue不为空时,从queue中取出头节点vi,遍历其所有未被染红的邻节点,通过松弛操作更新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);
通过这种BFS算法将图G中所有顶点都访问过后,算法结束。顶点v0到任意其他顶点vi的最短距离为dist(i)。该算法时间复杂度为O(∥V∥×log2∥V∥),其中log2∥V∥表示平均每个顶点的临边数量。
Introduction To Algorithms
源码
Dijkstra.h
Dijkstra.cpp
测试
DijkstraTest.cpp