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

Algorithm 查找非循环图中是否存在特定长度的路径,algorithm,graph,shortest-path,directed-acyclic-graphs,longest-path,Algorithm,Graph,Shortest Path,Directed Acyclic Graphs,Longest Path,在一个非循环图中,我试图找出两个给定节点之间是否存在长度为L的路径。我的问题是,在这种情况下使用的最佳和最简单的算法是什么 请注意,图形最多有50个节点和100条边 我尝试使用DFS查找所有路径,然后检查两个节点之间是否存在该路径,但我从在线法官那里得到了“超过时间限制”的答案 我也使用了统一成本搜索算法,但我也得到了否定的回答 我需要一个更有效的方法来解决这样的问题。谢谢。我不知道它是否会比DFS方法更快-但它将提供一个可行的解决方案: 将图形表示为矩阵a,并计算a^L-当且仅当a[i][j]

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

请注意,图形最多有50个节点和100条边

我尝试使用DFS查找所有路径,然后检查两个节点之间是否存在该路径,但我从在线法官那里得到了“超过时间限制”的答案

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


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

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

将图形表示为矩阵
a
,并计算
a^L
-当且仅当
a[i][j]!=0


另外,关于DFS解决方案:您不需要查找DFS中的所有路径-您应该将自己限制为长度的路径。我相信您可以使用以下算法查找树中的最长路径。这假设图形已连接,如果未连接,则需要在每个连接的组件上重新运行此操作:

  • 选择任意节点,A
  • 从a执行BFS(或DFS)要在树中找到距离a最远的节点,请调用此节点B
  • 从B执行BFS(或DFS)要在树中找到距离B最远的节点,请调用此节点C
  • 从B到C的路径是树中最长的路径(可能与最长路径并列)

  • 显然,如果此路径长于L,则可以缩短它以找到长度为L的路径。

    因为该图是非循环的,所以可以对顶点进行拓扑排序。 让我们命名起始顶点A和结束顶点B

    现在,核心算法开始: 对于每个顶点,计算从A到该顶点的所有可能距离。一开始有 从A到A的一条路径,长度为零。 然后按拓扑顺序取顶点。 拾取顶点x时:查看每个前置对象,并在此处更新可能的距离


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

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

    根据您的算法,如果您可以从B到另一个节点,那么为什么我们在步骤2中在B处停止?我们不应该一直走到最远的地方吗?你对“节点最远”的定义是什么?你在这里建议的算法的名称是什么?我们停在B,因为我们必须停下来,它是一个叶节点,没有其他地方可以去。然后我们从B开始做一个不同的搜索,我们会到达a,但我们会更进一步,到达C。如果没有节点Z,那么节点X离节点Y最远,因此从X到Z的距离大于从X到Y。我不知道这个算法是否有一个名称-我在学校时就想到了它。我当时必须证明它,但我记得证明有点乏味,所以我不想在这里重做。a我不认为问题是关于树的。@usamec-它是关于非循环图的,非循环图是树的。开始和结束节点在问题中指定。