迪杰斯特拉算法(dijkstra)
这里以v1为顶点,其他点为终点,vk代表该轮能达到最短路径的点,将s数组设为记录路径的数组
第一轮,v2与v3相比v2路径最短,
a=1 | a=2 | a=3 | a=4 | a=5 | |
---|---|---|---|---|---|
v2 | 1(v1,v2) | ||||
v3 | 12(v1,v3) | ||||
v4 | ∞ | ||||
v5 | ∞ | ||||
v6 | ∞ | ||||
vk | v2 | ||||
s | {v1,v2} |
将前驱结点更新为v2,此时v1到v3的路径为10,可更新;路径最短为v1到v4的路径
a=1 | a=2 | a=3 | a=4 | a=5 | |
---|---|---|---|---|---|
v2 | 1(v1,v2) | ||||
v3 | 12(v1,v3) | 10(v1,v2,v3) | |||
v4 | ∞ | 4(v1,v2,v4) | |||
v5 | ∞ | ∞ | |||
v6 | ∞ | ∞ | |||
vk | v2 | v4 | |||
s | {v1,v2} | {v1,v2,v4} |
将前驱结点更新为v4,v1到v3的路径为7,可以更新;
a=1 | a=2 | a=3 | a=4 | a=5 | |
---|---|---|---|---|---|
v2 | 1(v1,v2) | ||||
v3 | 12(v1,v3) | 10(v1,v2,v3) | 7(v1,v2,v4,v3) | ||
v4 | ∞ | 4(v1,v2,v4) | |||
v5 | ∞ | ∞ | 17(v1,v2,v4,v5) | ||
v6 | ∞ | ∞ | 19(v1,v2,v4,v6) | ||
vk | v2 | v4 | v3 | ||
s | {v1,v2} | {v1,v2,v4} | {v1,v2,v4,v3} |
将前驱结点更新为v3,重复上述操作
a=1 | a=2 | a=3 | a=4 | a=5 | |
---|---|---|---|---|---|
v2 | 1(v1,v2) | ||||
v3 | 12(v1,v3) | 10(v1,v2,v3) | 7(v1,v2,v4,v3) | ||
v4 | ∞ | 4(v1,v2,v4) | |||
v5 | ∞ | ∞ | 17(v1,v2,v4,v5) | 13(v1,v2,v4,v3,v5) | |
v6 | ∞ | ∞ | 19(v1,v2,v4,v6) | 19(v1,v2,v4,v6) | |
vk | v2 | v4 | v3 | v5 | |
s | {v1,v2} | {v1,v2,v4} | {v1,v2,v4,v3} | {v1,v2,v4,v3,v5} |
将前驱结点更新为v5
a=1 | a=2 | a=3 | a=4 | a=5 | |
---|---|---|---|---|---|
v2 | 1(v1,v2) | ||||
v3 | 12(v1,v3) | 10(v1,v2,v3) | 7(v1,v2,v4,v3) | ||
v4 | ∞ | 4(v1,v2,v4) | |||
v5 | ∞ | ∞ | 17(v1,v2,v4,v5) | 13(v1,v2,v4,v3,v5) | |
v6 | ∞ | ∞ | 19(v1,v2,v4,v6) | 19(v1,v2,v4,v6) | 17(v1,v2,v4,v3,v5,v6) |
vk | v2 | v4 | v3 | v5 | v6 |
s | {v1,v2} | {v1,v2,v4} | {v1,v2,v4,v3} | {v1,v2,v4,v3,v5} | {v1,v2,v4,v3,v5,v6} |
则该图v1到所有顶点的最短路径为{v1,v2,v4,v3,v5,v6}
最短路径的一个核心是动态更新前驱结点,而每次选择的结点都是通过贪心算法实现的,选择所有路径中最短的路径并将其最后一个结点更新为下一次出发的前驱结点。
我只是按照自己的理解整理了这篇笔记,也许讲的比较混乱。b站的一个up主的视频对这个算法的讲解比较通俗易懂:https://www.bilibili.com/video/BV1QK411V7V4?from=search&seid=4168589922693761411