【问题标题】:Dijkstra first node visitedDijkstra 访问的第一个节点
【发布时间】:2017-12-11 15:02:17
【问题描述】:

我正在用 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 指令会打印完整路径。你能告诉我我该怎么做吗?谢谢!

【问题讨论】:

  • 是的,有办法。如果您将相关功能编辑到您的问题中,我们将向您展示如何更改它。 (我们不喜欢这里的链接相关问题。)
  • 感谢 Beta 的回复,我已经编辑了帖子。你能告诉我我必须在函数中做哪些更改吗?

标签: c++ printing path dijkstra


【解决方案1】:

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

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);
}

(从您的问题中不清楚您是否了解递归。请注意,如果您不了解这些函数,将它们粘贴到您的代码中对您没有多大好处。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    • 2011-09-07
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多