算法步骤:
(1)、设置两个结点集合U、T,将源点v添加到U,其余所有顶点添加到T;
(2)、从给定点v开始,搜索其邻接结点,生成多条初始路径,并添加到路径集合Path;
(3)、从Path中计算路径长度最短的路径,如果U中不存在该路径的终点,则说明已经找到v到该结点的最短路径,添加该结点到U,且T中移除该结点;
(4)、根据(3)中得到的最短路径及该路径终点的邻接结点,若该路径未经过邻接结点,则扩展生成新的路径,如果其他路径已经经过该邻接结点,则比较新路径与已有路径的路径长度,保留路径长度最短的路径,之后删除该最短路径;
(5)、回到步骤(3),直到所有结点都添加到U。
以V1节点为开始点V11节点为结束点开始遍历路径图:
在v1点会直接遍历与其直接相连的路径,(v1-v2:2)(v1-v3:8)(v1-v4:1),最短路径为v1-v4,记录当前短路径为最短路径,由最短路径原理(不存通过其他点到达)得出v1-v4最短路径为1,T中移除v4并添加到U中ps:此时会照样把(v1-v2:2)(v1-v3:8)储存起来。结果如下图:
重点来了:此时v4能到达v3和v7,记(v1-v4-v3:8)(v1-v4-v7:10),发现此时路径(v1-v2:2)为最短路径,于是更新最短路径为v1-v2(因为Dijkstra算法即为永远只走最短的路径),幸亏通过上一步记录了(v1-v2:2)(v1-v3:8),虽然上一步并没有走那两条路。因为在上一步中,3条路径中(v1-v4:1)为最短路径,而现在的衍生路径中有四条(v1-v2:2),(v1-v3:8),(v1-v4-v3:8),(v1-v4-v7),而在这四条路径中(v1-v2:2)为最短路径,根据Djkstra算法就走了上一步储存的v1-v2 PS:这一步的衍生点为V4,会·先记录v1-v4-v3,v1-v4-v7,同时记录他们的权重值。不管最终走不走这新的衍生路,都要记录下来
结果如下图:
此时衍生点为v2,记录v1-v2-v3:8,记录v1-v2-v5:3,再从现在的5条衍生路径中选最短的路径:
后续结果便不在细说原因了
也由于其特点,不会去更新已经找到最短路径的点,所以在分析权重存在负值的路径是不合理的。这种情况下不适用Djksstra算法。