Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 利用栈求加权图的最短路径_C++_Algorithm_Graph_Shortest Path - Fatal编程技术网

C++ 利用栈求加权图的最短路径

C++ 利用栈求加权图的最短路径,c++,algorithm,graph,shortest-path,C++,Algorithm,Graph,Shortest Path,我将得到一些这样的图表,如下图所示。我搜索了一些算法,但似乎我不可能找出它们。事实上,使用它是有点可能的,但不幸的是,我只允许使用堆栈(而不是矩阵)。我也在寻找,但我找不到与我的问题的关系 显然,我的目标是获得从一点到另一点的所有最短路径。正如我提到的,我将以向量字符串的形式从堆栈中输出解决方案。我想我必须访问每个节点,我最担心的是在搜索过程中被堆积成一个循环,甚至失去轨迹。 还要注意,这不是一个有向图。如果Dijkstra的算法适用于这里,我将非常感谢你们中的任何人能够指导我,我将非常感谢你们

我将得到一些这样的图表,如下图所示。我搜索了一些算法,但似乎我不可能找出它们。事实上,使用它是有点可能的,但不幸的是,我只允许使用堆栈(而不是矩阵)。我也在寻找,但我找不到与我的问题的关系

显然,我的目标是获得从一点到另一点的所有最短路径。正如我提到的,我将以向量字符串的形式从堆栈中输出解决方案。我想我必须访问每个节点,我最担心的是在搜索过程中被堆积成一个循环,甚至失去轨迹。 还要注意,这不是一个有向图。如果Dijkstra的算法适用于这里,我将非常感谢你们中的任何人能够指导我,我将非常感谢你们的帮助、建议、想法,甚至是在搜索过程中不要陷入循环或失去轨道的设想


提前感谢。

如果您只想获得从某个选定节点到所有其他节点的所有最短路径的值,您可以使用Dijkstra算法——它基本上是增强BFS。一旦你了解了BFS背后的想法,你应该不会在理解Dijkstra方面有任何问题。实际上,使用单个
队列
实现BFS要比使用
数组
容易得多。 你必须使用
堆栈
,这是某种正式的(学校?)要求吗。如果是这样,那就很奇怪了。。。但您仍然可以以完全低效的方式模拟具有两个
堆栈的
队列

(顺便说一句,DFS使用堆栈)

如果您想拥有从所有节点到所有其他节点的所有最短路径,您可以从每个节点运行Dijkstra,或者您可以尝试Bellman Ford,它速度更快,但更难掌握

如果您只需要从一个节点到另一个节点的最短路径,那么(位增强)双向BFS将是最佳选择

如果你有Silverlight插件,你可以用我写的50%试用这个小应用程序:
您将在这里找到您感兴趣的算法的一步一步的演示(使用数据结构和伪代码)。希望它能帮助你

可能更适合于边是否未加权?否。它们是加权的。如果边权重为正,则可以在O(n^2)中实现Dijkstra算法,只需使用两个辅助数组来存储最短路径长度、从开始到路径上的前一个节点以及一个布尔数组来标记具有已知最短路径的节点。如果我们假设从P到F的最短路径为“PKCBICF”,那么我们将使用堆栈来推送或弹出节点的名称。如果我们使用bool数组来标记节点,我们可以看到节点“C”已经被访问了两次节点“C”是图中最大的一个,很难说感谢您的帮助。我将尝试使用Dijkstra算法,但我对跟踪访问节点有点困惑,主要是因为没有进入一个无限循环——你刚刚跟踪了访问节点——如果只允许使用堆栈,可能有点棘手,但仍然可行。看看BFS的伪代码(如果您有silverlight)。顺便说一句:我会首先尝试正常解决问题(没有任何限制),并尝试满足这些奇怪的要求。