Algorithm 无向图中给定两个顶点之间的最长简单路径
输入:n节点无向图G(V,E);V区结节s和t;正整数k 问题:在s和t之间是否有一条至少包含k条边的简单路径 我知道这个问题是NP难的,但问题是我应该如何以及用哪种算法来解决这个问题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的变化来解决:不在队列中存储节点,而是存储路径。另一个区别是,我们不忽略已经访问过的节点,而只忽略当前路径中已经包含的节点 使用单个路径初始化队列
到目前为止,我已经使用了BFS算法,但我认为它不是我应该使用的。在这一点上,我不知道如何继续。我不太确定我是否能找到解决这个问题的办法。近似值也可以。这可以通过BFS的变化来解决:不在队列中存储节点,而是存储路径。另一个区别是,我们不忽略已经访问过的节点,而只忽略当前路径中已经包含的节点
- 使用单个路径初始化队列,该路径仅包含节点
s
- 当队列为非空时:
- 从队列中轮询
。让路径
成为路径中的最后一个节点u
- 如果
:u=t
- 如果
中的节点数至少为path
,则k+1
是一个解决方案;返回结果“true”path
- 如果
- 否则,如果
: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