- 使用 `while` 循环遍历所有节点,直至所有节点都被访问。 . n+ Z) X& ^: _6 d( `7 w. g: Z- 找到当前未访问节点 `tb`,并更新这些节点的最短路径长度。4 P$ Y. x3 g. D B
- 选择距离最小的未访问节点来作为下一个要访问的节点。4 ?- t! \3 L! J' b
- 将该节点标记为已访问,并记录访问顺序。 3 n* p9 u2 c m, B( r 0 O8 j3 J" R; S' A[color=rgba(6, 8, 31, 0.88)]记录顺序和索引[color=rgba(6, 8, 31, 0.88)]:
index = index1(find(d(index1) == d(temp) - a(temp, index1))); - m. }/ ^, \' i- B6 o1 U+ F$ X
if length(index) >= 2 ) K6 U3 d2 w' K+ F
index = index(1); 6 F; P. o% ?6 e8 k$ J' o$ {
end 1 {0 c; D\" u4 O9 Z# p9 t
index2(temp) = index; % 将更新后的索引存入 index2
复制代码
- 通过计算当前节点与已访问节点的关系来更新节点索引 `index2`,确保最短路径的方向正确。3 V. Z C: I9 x. ?, C3 m
5 Y7 i, c. b7 c8 ^. ^5 H 总结最后,该算法实现了 Dijkstra 最短路径算法的基本逻辑:) `# b3 g! I c. `
. a3 e2 D) X( @0 ~ a/ q' A d
1. 初始化距离和访问标记。7 m' L# T6 i6 a* V5 B" z' P
2. 循环获取离起点最近的未访问节点,并更新其邻接节点的最短路径。" N' r+ p2 R) y# L' d" p
3. 重复这一过程,直到所有节点均被访问。/ x+ X5 m& ^% g' B" R! e& @
u _. z1 ^" T7 g% Z0 G" W3 b
最终返回的 `d` 是从起点到其他节点的最短路径长度数组,`index1` 是访问顺序,`index2` 是节点的索引顺序。这个算法的时间复杂度为 \(O(V^2)\),其中 \(V\) 是图中节点的数量。但在使用优先队列等数据结构优化时,可以将复杂度降低到 \(O((V + E) \log V)\),\(E\) 是边的数量。* l8 n6 B" K% k$ A! j6 M+ T8 v