【问题标题】:Algorithm to visit every node in a directed cyclic graph访问有向循环图中每个节点的算法
【发布时间】:2020-09-11 16:54:50
【问题描述】:

正如标题所说,我有一个包含循环且有向的图。它紧密相连,因此没有“卡住”的危险。给定一个起始节点,我想找到访问每个节点的路径(理想情况下是最短的,但这不是我优化的目标)。

值得一提的是,该图中的许多节点经常以双向方式连接 - 即它几乎是无向的。我想知道是否有修改后的 DFS 可能适用于这个特定的用例?

如果不是,我应该查看 Held-Karp 算法吗?一次访问和返回起点限制不适用于我。

【问题讨论】:

  • 正常的 DFS 或 BFS 没有成功吗?
  • @trincot 如果我错了,请纠正我,但循环不会与上述两者混为一谈吗?另外,我认为 BFS 的搜索空间可能会变得巨大。
  • 只要将节点标记为已访问(并且不要重新访问它们),两者都没有问题。当然,BFS 的特点是占用空间更大。一种 BFS 风格将整个路径存储在 BFS 队列的每个条目中:如果这是您的想法,请不要这样做。只需在路径(链表)上存储对 previous 节点的引用。
  • 但是对于循环/有向边,重新访问节点是必要的,不是吗?在此图上,例如 computersciencewiki.org/index.php/File:Directed_graph.png,唯一的步行将是 A、B、C、D、B、C、F。我看不出算法如何不能保证不会陷入循环。

标签: algorithm graph-theory graph-algorithm shortest-path graph-traversal


【解决方案1】:

最简单的方法可能是任意选择一个根并在 G 上计算 BFS 树(即从根到彼此顶点的路径)和在 G 的转置上的 BFS 树(即从彼此顶点的路径到根)。然后对于每个其他顶点,您可以通过交替的树路径导航到根部和从根部导航。此方法有各种快速优化。

另一种可能性是在由状态当前节点×已访问节点集组成的搜索空间上使用 A*,启发式等于尚未访问的节点数。最坏情况的运行时间与 Held-Karp 相当(您也可以在运行 Floyd-Warshall 后应用它以形成一个完整的非对称距离矩阵)。

【讨论】:

  • 我非常喜欢你的第一种方法。我想优化将围绕您在“根和返回”阶段访问顶点的顺序以及您是否需要每次都返回到根。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2015-10-26
  • 2011-06-06
  • 1970-01-01
相关资源
最近更新 更多