输入: n节点无向图 G(V,E); V中的节点 s 和 t ;正整数 k
问题: G中的s和t之间是否存在一条至少包含k条边的简单路径?
我知道这个问题很难解决,但是问题是我应该如何解决以及采用哪种算法?
到目前为止,我已经使用过BFS算法,但是我认为它不是我应该使用的算法。在这一点上,我不知道如何继续。我不太确定是否可以找到此问题的解决方案。近似也可以。
答案 0 :(得分:4)
这可以通过使用BFS的变体来解决:存储路径而不是将节点存储在队列中。另一个区别是,我们不会忽略已访问的节点,而只会忽略当前路径中已经包含的节点。
s
。path
。假设u
是路径中的最后一个节点。u = t
:
path
中的节点数至少为k + 1
,则path
是解决方案;返回结果为“ true”。u != t
:
v
中尚未存在的u
的每个邻居path
,通过将v
附加到path
来构造新路径,并将其插入队列。通过使用堆栈替换队列,使用DFS而不是BFS可以使用完全相同的解决方案。在那种情况下,堆栈通常将使用较少的内存,但不一定会找到最短的解决方案。由于您只想在存在这样的路径时回答true / false,因此不必寻找最短的路径,因此DFS可能更好。