首先让我们定义Dijkstra算法:
Dijkstra算法在具有非负边缘权重的有向图中找到单源最短路径
我想知道如何用 Dijkstra 算法保存最短路径形式。
我在谷歌搜索,但我找不到任何特别的东西;我也改变了Dijkstra算法,但我无法得到任何答案。如何用 Dijkstra 保存从s到t的最短路径?
我知道我的问题是基本的和不专业的,但任何帮助都将不胜感激。谢谢你考虑我的问题。
答案 0 :(得分:11)
如果你看一下你给出的维基百科链接中的pseudocode,你会看到一个名为prev[]
的数组。对于图中的每个节点 v ,此数组包含源节点 s <之间最短路径中的上一个节点 u / strong>和 v 。 (此数组也称为前任或父数组。)
换句话说, s 和 v 之间的最短路径是:
s -> u -> v
where u = prev[v]
从 s 到 u 的路径可能介于几个节点之间,因此要重建从 s 到 v <的路径/ strong>,您只需使用主伪代码下方的代码段(目标 v )沿着prev[]
数组定义的路径向后走:
1 S ← empty sequence
2 u ← target
3 while prev[u] is defined: // Construct the shortest path with a stack S
4 insert u at the beginning of S // Push the vertex onto the stack
5 u ← prev[u] // Traverse from target to source
6 end while
答案 1 :(得分:1)
大多数使用此算法的库可能会为您提供一种方法。但总的来说,只需跟踪每个节点的路径。即给每个节点一个attrribute shortestPathToNode
,在其中存储节点列表
答案 2 :(得分:0)
这样做的一个非常简短的方法是使用递归和一个&#34;父数组。&#34; 如果你初始化所有的点&#39;父母到-1,然后当你完成dijkstra,更新父阵列时,你可以从任何一点向后递归,直到你到达源并打印出路径。这是一个非常简短易懂的递归片段:
// Function to print shortest path from source to j using parent array
void path(parent array, int j)
{
// Base Case : If j is source
if (jth element of parent is -1) return;
path(parent, jth element of parent);
print j;
}
请注意,而不是打印&#34; j&#34; out,您可以将它存储在全局向量(或非C语言的其他数据类型)中供以后使用。