Dijkstra的算法通过构建一组与源节点距离最小的节点来从单个源节点寻找最短路径树。
图<年代up>[3]
该图有以下内容:
- 顶点或节点,在算法中表示为<年代pan class="katex">
v或<年代pan class="katex">
u;
- 连接两个节点的加权边:(<年代pan class="katex">
u,v)表示一条边,和<年代pan class="katex">
w(u,v)表示它的权重。在右边的图表中,每条边的权值都用灰色表示。
这可以通过初始化三个值来实现:
-
d我年代t,到源节点的距离数组<年代pan class="katex">
年代图中的每个节点,按如下方式初始化:<年代pan class="katex">
d我年代t(<年代pan class="katex">
年代) = 0;对于所有其他节点<年代pan class="katex">
v,<年代pan class="katex">
d我年代t(<年代pan class="katex">
v) =<年代pan class="katex">
∞。这是在开始时完成的,因为随着算法的进行,<年代pan class="katex">
d我年代t从源到每个节点<年代pan class="katex">
v在图中会重新计算并最终确定到最短距离时<年代pan class="katex">
v被发现
-
问,一个队列图中的所有节点。在算法的最后阶段,<年代pan class="katex">
问将是空的。
-
年代,一个空集,表示算法访问过哪些节点。在算法运行的最后,<年代pan class="katex">
年代将包含图的所有节点。
算法进行如下:
- 而<年代pan class="katex">
问不是空的,弹出节点吗<年代pan class="katex">
v,那还没有在<年代pan class="katex">
年代,从<年代pan class="katex">
问最小的<年代pan class="katex">
d我年代t(<年代pan class="katex">
v).在第一次运行中,源节点<年代pan class="katex">
年代会被选中是因为<年代pan class="katex">
d我年代t(<年代pan class="katex">
年代)初始化为0。在下一次运行中,下一个最小的节点<年代pan class="katex">
d我年代tValue被选中。
- 添加节点<年代pan class="katex">
v来<年代pan class="katex">
年代,表示<年代pan class="katex">
v被访问过
- 更新<年代pan class="katex">
d我年代t当前节点的相邻节点的值<年代pan class="katex">
v如下:对于每个新的相邻节点<年代pan class="katex">
u,
- 如果<年代pan class="katex">
d我年代t(<年代pan class="katex">
v) +<年代pan class="katex">
we我ght(u,v)<<年代pan class="katex">
d我年代t(<年代pan class="katex">
u),则会找到一个新的最小距离<年代pan class="katex">
u所以更新<年代pan class="katex">
d我年代t(<年代pan class="katex">
u)到新的最小距离值;
- 否则,不会对<年代pan class="katex">
d我年代t(<年代pan class="katex">
u).
该算法已经访问了图中的所有节点,并找到到每个节点的最小距离。<年代pan class="katex">
d我年代t现在包含了从源开始的最短路径树<年代pan class="katex">
年代。
注意:边的权值(<年代pan class="katex">
u,v)是从与(关联的值中获取的。<年代pan class="katex">
u,v)在图上。