无向图中给定两个顶点之间的最长简单路径

时间:2019-12-18 21:50:09

标签: algorithm graph graph-theory theory np

  

输入 n节点无向图 G(V,E); V中的节点 s t ;正整数 k

     

问题: G中的s和t之间是否存在一条至少包含k条边的简单路径?

我知道这个问题很难解决,但是问题是我应该如何解决以及采用哪种算法?

到目前为止,我已经使用过BFS算法,但是我认为它不是我应该使用的算法。在这一点上,我不知道如何继续。我不太确定是否可以找到此问题的解决方案。近似也可以。

1 个答案:

答案 0 :(得分:4)

这可以通过使用BFS的变体来解决:存储路径而不是将节点存储在队列中。另一个区别是,我们不会忽略已访问的节点,而只会忽略当前路径中已经包含的节点。

  • 初始化具有单个路径的队列,该队列仅包含节点s
  • 队列不是空的:
    • 从队列中轮询path。假设u是路径中的最后一个节点。
    • 如果u = t
      • 如果path中的节点数至少为k + 1,则path是解决方案;返回结果为“ true”。
    • 否则,如果u != t
      • 对于v中尚未存在的u的每个邻居path,通过将v附加到path来构造新路径,并将其插入队列。
  • 如果循环在没有找到解决方案的情况下终止,则不存在;返回结果为“ false”。

通过使用堆栈替换队列,使用DFS而不是BFS可以使用完全相同的解决方案。在那种情况下,堆栈通常将使用较少的内存,但不一定会找到最短的解决方案。由于您只想在存在这样的路径时回答true / false,因此不必寻找最短的路径,因此DFS可能更好。