在非循环图中,我试图找出两个给定节点之间是否存在长度为L的路径。我的问题是,在这种情况下使用的最佳和最简单的算法是什么。
请注意,图表最多有50个节点和100个边。
我试图使用DFS查找所有路径,然后检查两个节点之间是否存在该路径,但我从在线判断中得到了“超出时间限制”的答案。
我还使用了统一成本搜索算法,但我也得到了否定回应。
我需要一种更有效的方法来解决这个问题。谢谢。
答案 0 :(得分:5)
我不知道它是否会比DFS方法更快 - 但它会提供一个可行的解决方案:
将图形表示为矩阵A
,并计算 A^L
- 当且仅当A[i][j] != 0
<时,存在i和j之间的长度为L的路径/ p>
此外,关于DFS解决方案:您不需要在DFS中找到所有路径 - 您应该将自己限制为长度为&lt; = L 的路径,并且一旦长度超过了所需的长度,这会修剪一些搜索。一旦长度为L的路径到达目标,您也可以逃避搜索。
另一种可能的优化可能是bi-directional search。
答案 1 :(得分:2)
由于图形是非循环的,因此您可以拓扑排序顶点。 让我们命名起始顶点A并完成顶点B.
现在核心算法开始了: 对于每个顶点计数从A到此顶点的所有可能距离。一开始就有 从A到A的一条路径,长度为零。 然后以拓扑顺序获取顶点。 当您选择顶点x时:查看每个前任并在此处更新可能的距离。
这应该在O(N ^ 3)时间内运行。
答案 2 :(得分:0)
您可以使用修改后的Dijkstra算法,而不是为每个顶点保存与原点的最小距离,而是将所有可能的距离保存为小于或等于所需的距离。
答案 3 :(得分:-1)
我相信您可以使用以下算法查找树中最长的路径。这假定您的图表是连接的,如果不是,您需要在每个连接的组件上重新运行它:
显然,如果此路径长于L,那么您可以将其缩短以找到长度为L的路径。