如何在dijkstra算法中保存最短路径

时间:2015-03-11 22:29:11

标签: algorithm graph dijkstra shortest-path

首先让我们定义Dijkstra算法:
Dijkstra算法在具有非负边缘权重的有向图中找到单源最短路径 我想知道如何用 Dijkstra 算法保存最短路径形式。 我在谷歌搜索,但我找不到任何特别的东西;我也改变了Dijkstra算法,但我无法得到任何答案。如何用 Dijkstra 保存从s到t的最短路径?
我知道我的问题是基本的和不专业的,但任何帮助都将不胜感激。谢谢你考虑我的问题。

3 个答案:

答案 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语言的其他数据类型)中供以后使用。