查找非循环图中是否存在特定长度的路径

时间:2012-06-20 16:46:51

标签: algorithm graph shortest-path directed-acyclic-graphs longest-path

在非循环图中,我试图找出两个给定节点之间是否存在长度为L的路径。我的问题是,在这种情况下使用的最佳和最简单的算法是什么。

请注意,图表最多有50个节点和100个边。

我试图使用DFS查找所有路径,然后检查两个节点之间是否存在该路径,但我从在线判断中得到了“超出时间限制”的答案。

我还使用了统一成本搜索算法,但我也得到了否定回应。

我需要一种更有效的方法来解决这个问题。谢谢。

4 个答案:

答案 0 :(得分:5)

我不知道它是否会比DFS方法更快 - 但它会提供一个可行的解决方案:

将图形表示为矩阵A,并计算 A^L - 当且仅当A[i][j] != 0 <时,存在i和j之间的长度为L的路径/ p>

此外,关于DFS解决方案:您不需要在DFS中找到所有路径 - 您应该将自己限制为长度为&lt; = L 的路径,并且一旦长度超过了所需的长度,这会修剪一些搜索。一旦长度为L的路径到达目标,您也可以逃避搜索。

另一种可能的优化可能是bi-directional search

  • 查找从源到路径长度为L / 2的所有顶点 它们。
  • 接下来,找到所有具有长度为L / 2的路径的顶点 到目标(反向图上的DFS)
  • 然后,检查是否存在两个集合共有的顶点if 有 - 你有一条从源头到目标的长度为L的路径。

答案 1 :(得分:2)

由于图形是非循环的,因此您可以拓扑排序顶点。 让我们命名起始顶点A并完成顶点B.

现在核心算法开始了: 对于每个顶点计数从A到此顶点的所有可能距离。一开始就有 从A到A的一条路径,长度为零。 然后以拓扑顺序获取顶点。 当您选择顶点x时:查看每个前任并在此处更新可能的距离。

这应该在O(N ^ 3)时间内运行。

答案 2 :(得分:0)

您可以使用修改后的Dijkstra算法,而不是为每个顶点保存与原点的最小距离,而是将所有可能的距离保存为小于或等于所需的距离。

答案 3 :(得分:-1)

我相信您可以使用以下算法查找树中最长的路径。这假定您的图表是连接的,如果不是,您需要在每个连接的组件上重新运行它:

  1. 选择一个任意节点,A。
  2. 从A中执行BFS(或DFS)以找到距离A最远的树中的节点,将此节点称为B.
  3. 从B执行BFS(或DFS)以找到距离B最远的树中的节点,将此节点称为C.
  4. 从B到C的路径是树中最长的路径(可能是最长的路径)。
  5. 显然,如果此路径长于L,那么您可以将其缩短以找到长度为L的路径。