接上文
Dijkstra最短路径搜索算法非常著名,该算法适用于权重非负的加权有向图中最短路径搜索.
Dijkstra最短路径搜索算法:
使用distTo[]索引数组记录搜索起点到节点i的路径长度.若当前最短路径搜索起点为s, 初始化distTo[s]为0, 其余元素为正无穷大.
每次选择distTo[]元素最小且尚未被松弛的节点进行邻边松弛, 当所有节点松弛完毕后, 所有从s可达的节点v的最短路径均搜索完成.
证明:
假设,当前未被松弛的节点中,有
d
i
s
t
T
o
[
v
]
distTo[v]
distTo[v]最小, 对节点
v
v
v的所有邻边
v
−
>
w
v->w
v−>w进行松弛, 若当前松弛成功, 则
d
i
s
t
T
o
[
w
]
=
d
i
s
t
T
o
[
v
]
+
W
v
−
>
w
distTo[w] = distTo[v] + W_{v->w}
distTo[w]=distTo[v]+Wv−>w, 由于图中所有边权重均非负, 因此
d
i
s
t
T
o
[
w
]
>
=
d
i
s
t
T
o
[
v
]
distTo[w] >= distTo[v]
distTo[w]>=distTo[v]. 如松弛失败, 则
d
i
s
t
T
o
[
w
]
distTo[w]
distTo[w]未更新,
d
i
s
t
T
o
[
w
]
>
=
d
i
s
t
T
o
[
v
]
distTo[w] >= distTo[v]
distTo[w]>=distTo[v].综上, 在节点
v
v
v完成其邻边的松弛后, 图中的其他未松弛节点
d
i
s
t
T
o
[
]
distTo[]
distTo[]值均大于
d
i
s
t
T
o
[
v
]
distTo[v]
distTo[v],因此
v
v
v节点不会在后续被其他节点松弛, 因此在完成节点
v
v
v的松弛后,
d
i
s
t
T
o
[
v
]
distTo[v]
distTo[v]的值即为起点
s
s
s到
v
v
v的最短路径. 当所有节点均完成松弛后, 不存在任意边能够对节点进行松弛, 因此根据最短路径最优性条件,起点
s
s
s到其他可达顶点的最短路径均完成搜索.
根据该推论, 由于已被松弛过的节点不会在后续其他节点松弛过程中进一步松弛, 因此每一步只有未被松弛的节点
w
w
w, 其
d
i
s
t
T
o
[
w
]
distTo[w]
distTo[w]会发生变化.