1.单源点的最短路径问题:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。
我们用一个例子来具体说明迪杰斯特拉算法的流程。
定义源点为 0,dist[i]为源点 0 到顶点 i 的最短路径。其过程描述如下:
步骤dist[1]dist[2]dist[3]dist[4]已找到的集合
第 1 步
8
1
2
+∞
{2}
第 2 步
8
×
2
4
{2, 3}
第 3 步
5
×
×
4
{2, 3, 4}
第 4 步
5
×
×
×
{2, 3, 4, 1}
第 5 步
×
×
×
×
{2, 3, 4, 1}
第 1 步:从源点 0 开始,找到与其邻接的点:1,2,3,更新dist[]数组,因 0 不与 4 邻接,故dist[4]为正无穷。在dist[]中找到最小值,其顶点为 2,即此时已找到 0 到 2 的最短路。
第 2 步:从 2 开始,继续更新dist[]数组:2 与 1 不邻接,不更新;2 与 3 邻接,因0→2→3比dist[3]大,故不更新dist[3] ;2 与 4 邻接,因0→2→4比dist[4]小,故更新dist[4]为 4。在dist[]中找到最小值,其顶点为 3,即此时又找到 0 到 3 的最短路。
第 3 步:从 3 开始,继续更新dist[]数组:3 与 1 邻接,因0→3→1比dist[1]小,更新dist[1]为 5;3 与 4 邻接,因0→3→4比dist[4]大,故不更新。在dist[]中找到最小值,其顶点为 4,即此时又找到 0 到 4 的最短路。
第 4 步:从 4 开始,继续更新dist[]