给定一个有向加权图G=(V,E),运行Dijkstra算法可以产生多个具有不同权重的最短路径树as seen in this picture,其中A是源,D是目标。如何创建一个在运行Dijkstra算法(O(V+E)logV)的同时返回总权重最小的Dijkstra树的算法?
发布于 2020-07-29 06:36:43
通常,在Dijkstra运行时,通过跟踪通向每个节点的最佳边来构建树。例如,下面代码中的prev[]数组通过记录通向每个节点的最佳边来包含树;即,prev[]数组包含树中每个节点的父节点:
shortestPath(G, A, D, prev[])
for v in G.V
dist[v] = infinity
prev[v] = -1 // no parent (assumes nodes are positive integers)
dist[A] = 0
for v in G.V
Q.insert(v, dist[v])
while Q not empty
u = Q.deleteMin()
if dist[u] >= infinity
return false // no path to u
if u == D
return true // found path (don't stop if you want the whole tree)
for all v adjacent to u
let d = dist[u] + v.weight
if d < dist[v]
dist[v] = d
prev[v] = u // update parent
Q.decreaseKey(v, d)由于prev[]记录了每棵树的父节点,因此您可以通过回溯找到最优路径:
v = D
while v >= 0
path.addFirst(v)
v = prev[v]在任何情况下,prev[]都持有这棵树。如果你想要一个不同形式的树,你只需要post process prev[]即可。
https://stackoverflow.com/questions/63143404
复制相似问题