Dijkstra 算法解决带非负权重的有向图上单源路径最短问题,若实现方法合适,则其运行时间小于 Bellman_Ford 算法。
Dijkstra 算法在运行过程中维持一组关键信息:结点集合S,从源节点 s 到该集合中每个结点的最短路径已经被找到。算法将重复从V - S 中选择最短路径估计最小的结点 u,并对它进行加入到集合、对所有从 u 出发的边进行松弛。
其中,我们用最小优先队列管理结点集合 V - S。与之前相同,我们用最短路径估计来作为队列中结点比较的方式。
Dijkstra(G, w, s)
Initialize_Single_Source(G, s)
S = NULL
Q = G.V
while Q != NULL
u = Extract_Min(Q);
S = S∪{u};
for each vertex v∈G.Adj[u]
Relax(u, v, w)
该算法由源节点出发开始循环,并在循环中一遍又一遍选择d最小的结点,并通过将它出队列中排出,并松弛由它出发的边。因此可以看到,该算法实行的是贪心算法——选取路径最短的结点并纳入到S中。
定理6(Dijkstra 算法的正确性): Dijkstra 算法运行在带权重的有向图 G = (V, E)时,若所有权重非负,则算法终止时,对于所有结点 v ∈ V,我们有 u.d = δ(s, u)。
证明:
在初始化时&#