Dijkstra算法,中文翻译为迪杰斯特拉算法,是在带权有向图G = (V, W) (V是节点的集合,W是边上权值的集合,在集合W中,不直接相连的节点间的距离标记为无穷大)中求某个节点到其余节点之间最短路径的经典算法。该算法的核心思想是将图中所有的节点划分为2个集合,集合S包含已经找到最短路径的节点,集合U包含尚未找到最短路径的节点的距离(初始值全部设定为无穷大)。从某一点v开始采用广度优先遍历思想对图进行遍历,每找到一个节点的最短路径,就将该节点从集合U中移除,并加入到集合S中,直到最后U变为空集,S包含图中所有的节点到出发点的最小距离。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。
Dijkstra算法的过程:
选取某个节点v作为出发点,从出发点到出发点距离为0,即找到最小路径。将该出发点从集合U中移除并加入到集合S中。
在集合W中查看出发点v到集合U中各个节点的距离。找出距离最小的节点k(到k的最短路径找到),将k从集合U中移除并加入到集合S中。
以k作为中间点,在W中查看从k到U中节点m的距离,如果m在W中的值小于m在U中的值(k和m直接连接),将m在W中的值与k在U中的值相加(从v出发经过k到达m的距离),再将相加结果与W中v到m的值(v不经过中间点到m的距离)对比大小,选取较小的值跟新k在U中的数据。
在U中找出数值最小的节点n,该值即为v到n的最短路径。将n从集合U中移除并加入到集合S中。把n作为中间点重复第3、4步,直到U中所有的节点都移动到S中。
图1
Dijkstra算法的