【发布时间】:2020-07-28 21:58:51
【问题描述】:
给定一个有向加权图 G=(V, E),运行 Dijkstra 算法可以生成多个具有不同权重的最短路径树as seen in this picture,其中 A 是源,D 是目标。如何创建一个算法,在运行 Dijkstra 算法 (O(V+E)logV) 的同时返回总权重最小的 Dijkstra 树?
【问题讨论】:
标签: algorithm graph computer-science dijkstra
给定一个有向加权图 G=(V, E),运行 Dijkstra 算法可以生成多个具有不同权重的最短路径树as seen in this picture,其中 A 是源,D 是目标。如何创建一个算法,在运行 Dijkstra 算法 (O(V+E)logV) 的同时返回总权重最小的 Dijkstra 树?
【问题讨论】:
标签: algorithm graph computer-science dijkstra
通常您在 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[] 持有树。如果您希望树采用不同的形式,您只需发布流程prev[]。
【讨论】: