Dijkstra第一个节点访问过

时间:2017-12-11 15:02:18

标签: c++ printing path dijkstra

我正在用C ++实现Dijkstra程序,而且我遇到了一些问题,让我解释一下:

目前我一直关注此代码: http://www.geeksforgeeks.org/printing-paths-dijkstras-shortest-path-algorithm/

此代码打印从源到所有其他顶点的完整路径。 我使用数组int parent [num_vertexs];存储路径。但问题是我不想要完整路径,只需要访问第一个顶点。

如何只访问第一个访问过的节点?有没有办法只为每个节点打印父数组的第一个节点?

非常感谢你的时间。

编辑: 我将向您展示我打印父数组的功能,该数组包含从源顶点到所有其他顶点的完整路径。

void printPath(int parent[], int j){
// Base Case : If j is source
if (parent[j]==-1)
    return;

printPath(parent, parent[j]);

printf("%d ", j);

}

此函数打印完整路径,但我只想要路径的第一个顶点。问题是我不知道如何只为每个顶点打印第一个,因为printf指令打印完整路径。你能告诉我我该怎么办?谢谢!

1 个答案:

答案 0 :(得分:0)

这个函数是递归的;它调用自身打印除最后一个顶点之外的所有路径,然后打印最后一个顶点。限制它打印第一个顶点的简单粗暴方法是排除其余的:

void printFirstStep(int parent[], int j){
  // Base Case : If j is source
  if (parent[j]==-1)
    return;

  printFirstStep(parent, parent[j]);

  if (parent[parent[j]]==-1)
    printf("%d ", j);
}

更好的方法是将代码从递归更改为迭代(即非递归):

void printFirstStep(int parent[], int j){
  // Base Case : If j is source
  if (parent[j]==-1)
    return;

  while(parent[parent[j]] != -1)
    j = parent[j];

    printf("%d ", j);
}

(您的问题并不清楚您是否理解递归。请注意,如果您不理解这些功能,请将它们粘贴到您的代码中。你太好了。)