给定一个无向(连接)图表,我希望列出从最s
个边缘使用t
到k
的所有路径。
当然,一种天真的方法只需要一个BFS并在k
步骤s
之后(或k
步之后切断的DFS)停止它,报告任何事情路径最终在t
。
我想知道是否有更复杂的方法来做到这一点?
答案 0 :(得分:2)
我在这里看不到你如何使用BFS或DFS。由于您需要枚举从s
到t
的所有可能路径,因此如果没有一些递归搜索,您无法解决它。此外,通常路径的数量在k
中是指数的,因此不希望任何主要的渐近复杂度改进。
在我看来,只有修剪可以稍微帮助你。 以下是两种值得一提的修剪方法:
第一个是在中间相遇方法。
不是从顶点<= k
搜索距离为s
的所有顶点,而是找到两组顶点:距离<= k/2
距离s
,距离{{1来自<= k/2
。只需启动两次搜索(BFS或递归)即可获得它们。最后,合并结果:对于这两个集合中的每个公共顶点t
,从v
到s
以及从v
到{{1}的路径采用所有路径对}(反转),并输出连接的路径。
上述确切方法会多次列出一些路径。为了解决这个问题,请将每个特定长度的路径存储在单独的列表中。然后分别合并每个长度的路径。 请注意,如果您只想获得简单路径(即没有重复顶点),那么MitM方法不适用。
第二种方法是使用距离估计,类似于A* search algorithm的方式。假设您已确保从任何顶点t
到目标顶点v
的距离下限。然后,如果肯定无法继续从v
到t
的足够短的完整路径,您可以将任何部分路径从s
删除到v
。
答案 1 :(得分:0)
这实际上不是您需要的bfs,因为要获取所有路径,您必须保留已访问过的相邻顶点。
使用以下图表:
包含2个步骤的0到1的所有路径都是[0,0,1],[0,1,1]
天真的解决方案是保持每个步骤中活动的节点列表(具有重复项)。要从词干i转到i + 1,请为每个顶点创建一个包含所有相邻顶点的新列表(不要删除重复项)。