【问题标题】:How to trace the path that visits all nodes in bfs/dfs如何跟踪访问 bfs/dfs 中所有节点的路径
【发布时间】:2020-05-24 14:46:15
【问题描述】:

这类似于How to trace the path in a Breadth-First Search?,但该帖子的答案中描述的方法似乎不适用于我的情况。

这里的路径,我本质上是指从开始状态到结束状态的一系列连接节点。

考虑一个顶点 V={a,b,c} 和边 = {{a,b},{a,c}} 的无向图,并假设我们必须按字母顺序遍历后继图。我们从节点 a 开始,结束状态是访问所有 3 个节点。

广度优先搜索将首先访问边缘a->b,然后是边缘a->c。所以解决路径是a->b->a->c。由于bc 之间没有边,我们必须回到a(所以我们必须遍历边b->a)。在上述链接帖子的答案中,接受的解决方案只会输出a->c

我想不出一种方法来修改传统的 bfs 算法来做到这一点。我对 dfs 有同样的问题,但我现在想从 bfs 开始。

【问题讨论】:

  • a->b->a->c 表示访问的节点序列。路径不是那个顺序。从ac 的路径不经过b,而是直接经过a>c
  • 但是如果你按字母顺序遍历后继者,从ac 的路径将必须经过b
  • 没错。您正在遍历以搜索路径。遍历序列确实是 a->b->a->c 。找到的路径是a->c
  • 请回复贴出的两个答案

标签: search graph depth-first-search breadth-first-search graph-traversal


【解决方案1】:

想要这样做似乎很奇怪。使用深度优先搜索(DFS)当然更简单,它总是沿着边缘或沿着该边缘回溯。相比之下,广度优先搜索 (BFS) 通常不会访问(或回溯到)与前一个访问过的节点相邻的节点。

具体来说,你的这部分问题是错误的,并揭示了一个误解:

由于bc之间没有边,我们必须通过a返回(所以我们必须遍历边b -> a)。

在您的示例中,BFS 永远不会将边缘从 b 遍历回 a。它完成对b 的访问,然后从队列中轮询c 并立即访问c,而不是通过a“旅行”到那里。

打个比方,将 DFS 视为追踪路径是有道理的;如果您在迷宫中,您可以使用面包屑标记您“访问过”的地方,从而通过 DFS 解决迷宫。相比之下,人类无法通过 BFS 解决迷宫,因为人类无法拥有他们知道如何到达的地方的队列,并“传送”到队列中的下一个地方。 BFS 不会有意义地找出您可以通过沿着图中的边移动来遵循的路径。


也就是说,如果你真的想要,你可以构造一条访问图节点的路径,这样每个节点第一次访问的顺序与 BFS 相同。最简单的方法是执行 BFS,以“BFS 顺序”构建节点列表,同时构建“BFS 树”。然后对于 BFS 顺序中的每个节点,您可以从前一个节点通过它们在 BFS 树中的最低共同祖先到达它。此路径仅通过之前已按 BFS 顺序访问过的节点。

【讨论】:

  • 这实际上是一个项目的一部分,特别是旅行商问题,我们的任务是通过使用各种搜索方法(如 BFS、DFS、UCS)访问所有城市的图找到一条连续路径, A* 等...我最终弄清楚了如何做到这一点,它需要在状态空间而不是图形空间中完成。
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 2019-01-13
相关资源
最近更新 更多