Dijkstra Dijkstra算法

问题

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

解法

G(i,j)G(i, j)为顶点viv_ivjv_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}

类似BFS算法,初始时将v0v_0加入队列queuequeue中并染红。当queuequeue不为空时,从queuequeue中取出头节点viv_i,遍历其所有未被染红的邻节点,通过松弛操作更新v0v_0viv_i的所有邻节点(设邻节点为vjv_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)

通过这种BFS算法将图GG中所有顶点都访问过后,算法结束。顶点v0v_0到任意其他顶点viv_i的最短距离为dist(i)dist(i)。该算法时间复杂度为O(V×log2V)O(\| V \| \times log_2 \| V \|),其中log2Vlog_2 \| V \|表示平均每个顶点的临边数量。

Introduction To Algorithms

源码

Dijkstra.h

Dijkstra.cpp

测试

DijkstraTest.cpp

Last updated