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