Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个顶点到其他所有顶点的最短路径。
问题描述: 如下无向图, 若从顶点1开始计算到其余各顶点的最短路径
首先需要3个辅助数组:
- dist[] : 记录从顶点1开始到其余各顶点的最短路径
- visited[] : 记录该顶点是否被访问过, 初始值设为0
- path[] : 记录该顶点最短路径的前驱顶点
求最短路径步骤:
①初始化数组:计算从顶点0到其余各顶点的路径长度
顶点 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
dist[] | 0 | 12 | ∞ | ∞ | ∞ | 16 | 14 |
path[] | -1 | 1 | -1 | -1 | -1 | 1 | 1 |
visited[] | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
②由于dist数组中目前最小值为顶点2,计算从顶点2到其余各顶点的距离, 若小于当前dist数组中的值, 则更新dist和path数组;若大于当前dist数组的值, 则不做改变
顶点 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
dist[] | 0 | 12 | 22 | ∞ | ∞ | 16 | 14 |
path[] | -1 | 1 | 2 | -1 | -1 | 1 | 1 |
visited[] | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
③选择dist数组中未被访问过的最小值顶点7, 同上
顶点 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
dist[] | 0 | 12 | 22 | ∞ | 22 | 16 | 14 |
path[] | -1 | 1 | 2 | -1 | 7 | 1 | 1 |
visited[] | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
④选择dist数组中未被访问过的最小值顶点6
顶点 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
dist[] | 0 | 12 | 22 | ∞ | 18 | 16 | 14 |
path[] | -1 | 1 | 2 | -1 | 6 | 1 | 1 |
visited[] | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
⑤选择dist数组中未被访问过的最小值顶点5
顶点 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
dist[] | 0 | 12 | 22 | 22 | 18 | 16 | 14 |
path[] | -1 | 1 | 2 | 5 | 6 | 1 | 1 |
visited[] | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
⑥选择dist数组中未被访问过的最小值顶点3或者4都可以, 如选择3
顶点 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
dist[] | 0 | 12 | 22 | 22 | 18 | 16 | 14 |
path[] | -1 | 1 | 2 | 5 | 6 | 1 | 1 |
visited[] | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
⑦选择dist数组最后一个顶点4
顶点 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
dist[] | 0 | 12 | 22 | 22 | 18 | 16 | 14 |
path[] | -1 | 1 | 2 | 5 | 6 | 1 | 1 |
visited[] | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
到这里为止, visited数组元素全为1, 即所有顶点都被访问过, 最短路径见如上图。