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

Algorithm 无向图中给定两个顶点之间的最长简单路径,algorithm,graph,graph-theory,theory,np,Algorithm,Graph,Graph Theory,Theory,Np,输入:n节点无向图G(V,E);V区结节s和t;正整数k 问题:在s和t之间是否有一条至少包含k条边的简单路径 我知道这个问题是NP难的,但问题是我应该如何以及用哪种算法来解决这个问题 到目前为止,我已经使用了BFS算法,但我认为它不是我应该使用的。在这一点上,我不知道如何继续。我不太确定我是否能找到解决这个问题的办法。近似值也可以。这可以通过BFS的变化来解决:不在队列中存储节点,而是存储路径。另一个区别是,我们不忽略已经访问过的节点,而只忽略当前路径中已经包含的节点 使用单个路径初始化队列

输入:n节点无向图G(V,E);V区结节st;正整数k

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

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


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

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

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

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

我确实修改了BFS,与您所说的非常相似。这真的很有效,谢谢你的解释,也谢谢你的另一种方法。我生成了一组具有不同数量顶点和边的随机图作为测试用例(10020050010002000图)。之后,我对这些图使用了BFS方法。但是当我使用一个有12个顶点或以上的图时,程序会一直运行,并且不会给出任何输出。我使用了100个带有15个顶点的图形作为输入,并等待了大约8-9个小时,但程序仍在运行。这正常吗?在最坏的情况下,时间复杂度应该是n^k,所以如果你在寻找长度为k=n-1或接近该长度的路径,那么它会迅速上升,是的。我对算法的复杂度有一些疑问,但我会自己解决。你的解释对我帮助很大。谢谢你的帮助,我很感激@卡亚3