Search 如何跟踪访问bfs/dfs中所有节点的路径
这与类似,但在那篇文章的答案中描述的方法似乎不适用于我的案例 这里的路径基本上是指从开始到结束状态的一系列连接节点 考虑一个顶点为V={a,b,c}且边为{{a,b},{a,c}的无向图,并假设我们必须按字母顺序遍历后继图。我们从节点Search 如何跟踪访问bfs/dfs中所有节点的路径,search,graph,depth-first-search,breadth-first-search,graph-traversal,Search,Graph,Depth First Search,Breadth First Search,Graph Traversal,这与类似,但在那篇文章的答案中描述的方法似乎不适用于我的案例 这里的路径基本上是指从开始到结束状态的一系列连接节点 考虑一个顶点为V={a,b,c}且边为{{a,b},{a,c}的无向图,并假设我们必须按字母顺序遍历后继图。我们从节点a开始,结束状态是访问所有3个节点 宽度优先搜索将首先访问边缘a->b,然后访问边缘a->c。因此,解决方案路径是a->b->a->c。由于b和c之间没有边界,我们必须返回a(因此我们必须遍历边界b->a)。在上面链接的帖子中的答案中,接受的解决方案将只输出a->c
a
开始,结束状态是访问所有3个节点
宽度优先搜索将首先访问边缘a->b
,然后访问边缘a->c
。因此,解决方案路径是a->b->a->c
。由于b
和c
之间没有边界,我们必须返回a
(因此我们必须遍历边界b->a
)。在上面链接的帖子中的答案中,接受的解决方案将只输出a->c
我想不出一种方法来修改传统的bfs算法来做到这一点。我对dfs有同样的问题,但我现在想从bfs开始 想这样做似乎很奇怪。深度优先搜索(DFS)当然更简单,它总是跟随一条边或沿着该边回溯。相比之下,广度优先搜索(BFS)通常不会访问(或回溯到)与先前访问的节点相邻的节点 具体来说,你问题的这一部分是错误的,并且揭示了一种误解: 由于
b
和c
之间没有边界,我们必须返回a
(因此我们必须遍历边界b->a
)
在您的示例中,BFS永远不会从b
到a
来回移动边。它完成访问b
,然后从队列中轮询c
,并立即访问c
,而无需通过a
到那里“旅行”
打个比方,把DFS看作是在寻找一条路径是有道理的;如果你在迷宫中,你可以用面包屑来标记你“访问过”的地方,从而通过DFS解决迷宫问题。相比之下,人类无法通过BFS解决迷宫问题,因为人类无法拥有一列他们知道如何到达的地方,并且无法“传送”到队列中的下一个地方。BFS不会有意义地沿着图中的边绘制出您可以遵循的路径
也就是说,如果您真的想要,您可以构造一条访问图中节点的路径,这样每个节点第一次访问的顺序与BFS相同。实现这一点的最简单方法是执行BFS以“BFS顺序”构建节点列表,同时构建“BFS树”。然后,对于BFS顺序中的每个节点,您可以通过BFS树中它们的最低公共祖先从上一个节点到达它。此路径仅通过先前已按BFS顺序访问的节点。
a->b->a->c
表示访问的节点顺序。路径不是那个序列。从a
到c
的路径不是经过b
,而是直接经过a>c
。但是如果按字母顺序遍历后续路径,则从a
到c
的路径必须经过b
。没错。您正在遍历以搜索路径。遍历顺序确实是a->b->a->c
。找到的路径是a->c
请回复这两个答案postedIt实际上是一个项目的一部分,特别是旅行推销员问题,我们的任务是通过使用各种搜索方法(如BFS、DFS、UCS、a*)访问所有城市的图来找到一条连续路径。。。我最终找到了如何做到这一点,这需要在状态空间而不是图形空间中完成。