我正在用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指令打印完整路径。你能告诉我我该怎么办?谢谢!
答案 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);
}
(您的问题并不清楚您是否理解递归。请注意,如果您不理解这些功能,请将它们粘贴到您的代码中。你太好了。)