BFS? - 找到从s到t的所有路径,最多只有一定的长度

时间:2016-05-16 14:23:19

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

给定一个无向(连接)图表,我希望列出从最s个边缘使用tk的所有路径。

当然,一种天真的方法只需要一个BFS并在k步骤s之后(或k步之后切断的DFS)停止它,报告任何事情路径最终在t

我想知道是否有更复杂的方法来做到这一点?

2 个答案:

答案 0 :(得分:2)

我在这里看不到你如何使用BFS或DFS。由于您需要枚举从st的所有可能路径,因此如果没有一些递归搜索,您无法解决它。此外,通常路径的数量在k中是指数的,因此不希望任何主要的渐近复杂度改进。

在我看来,只有修剪可以稍微帮助你。 以下是两种值得一提的修剪方法:

第一个是在中间相遇方法。

不是从顶点<= k搜索距离为s的所有顶点,而是找到两组顶点:距离<= k/2距离s,距离{{1来自<= k/2。只需启动两次搜索(BFS或递归)即可获得它们。最后,合并结果:对于这两个集合中的每个公共顶点t,从vs以及从v到{{1}的路径采用所有路径对}(反转),并输出连接的路径。

上述确切方法会多次列出一些路径。为了解决这个问题,请将每个特定长度的路径存储在单独的列表中。然后分别合并每个长度的路径。 请注意,如果您只想获得简单路径(即没有重复顶点),那么MitM方法适用。

第二种方法是使用距离估计,类似于A* search algorithm的方式。假设您已确保从任何顶点t到目标顶点v的距离下限。然后,如果肯定无法继续从vt的足够短的完整路径,您可以将任何部分路径从s删除到v

答案 1 :(得分:0)

这实际上不是您需要的bfs,因为要获取所有路径,您必须保留已访问过的相邻顶点。

使用以下图表:

  • 0→1
  • 0→0
  • 1→1

包含2个步骤的0到1的所有路径都是[0,0,1],[0,1,1]

天真的解决方案是保持每个步骤中活动的节点列表(具有重复项)。要从词干i转到i + 1,请为每个顶点创建一个包含所有相邻顶点的新列表(不要删除重复项)。