【问题标题】:Finding Shortest Paths of weighted graph using stacks使用堆栈查找加权图的最短路径
【发布时间】:2013-11-15 19:06:41
【问题描述】:

我将得到如下图所示的某种图表。我搜索了一些算法,但似乎我无法弄清楚它们。事实上使用Floyd–Warshall algorithm 是有可能的,但不幸的是我只被允许使用堆栈(而不是矩阵)。我也找了Dijkstra's algorithm,但我找不到与我的问题的关系。

显然我的目标是让所有最短路径从一个点到另一个点。正如我所提到的,我只会将我的 stack 中的解决方案输出为向量字符串。我想我必须访问每个节点,我最害怕的是在搜索过程中被堆叠成一个循环甚至丢失轨道。 另请注意,这不是有向图。如果 Dijkstra 的算法适用于这里,我将非常感激你们中的任何人能指导我,我非常感谢任何帮助、建议、想法甚至是在搜索时不陷入循环或丢失轨道的愿景。

提前致谢。

【问题讨论】:

  • 可能更适合cs.stackexchange.com
  • 边缘是否未加权?
  • 没有。它们是加权的
  • 如果边权重为正,您可以在 O(n^2) 中实现 Dijkstra 算法,仅使用几个辅助数组来存储最短路径长度、路径上的前一个节点和一个布尔数组,用于标记已知最短路径的节点。我看不出任何堆栈的使用。
  • 如果我们假设从 P 到 F 的最短路径:“PKCBICF”,我们将使用堆栈来推送或弹出节点的名称。如果我们使用 bool 数组来标记节点,我们可以看到节点“C”已经被访问了两次。 // 节点“C”是图中最大的一个,几乎看不到

标签: c++ algorithm graph shortest-path


【解决方案1】:

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

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

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

如果您只想要从单个节点到其他节点的最短路径,(位增强)双向 BFS 将是最佳选择。

如果你有 Silverlight 插件,你可以试试这个我写的 50% 的小应用程序: http://grzesiaka.home.pl/GraphTutor/ 您会在此处找到您感兴趣的算法的逐步介绍(包含数据结构和伪代码)。希望对您有所帮助!

【讨论】:

  • 非常感谢您的帮助。我会尝试使用 Dijkstra 算法,但我对跟踪访问的节点有点困惑,主要是因为没有进入无限循环
  • 你只是跟踪访问过的节点——如果你只被允许使用堆栈可能有点棘手,但仍然可行。查看 BFS 的伪代码(如果您有 silverlight)。顺便说一句:我会首先尝试正常解决问题(没有任何限制)并尝试满足这些奇怪的要求。
猜你喜欢
  • 1970-01-01
  • 2016-06-25
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多