【问题标题】:Longest simple path between given two vertices in an undirected graph无向图中给定两个顶点之间的最长简单路径
【发布时间】:2019-12-18 21:50:09
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: algorithm graph graph-theory theory np


    【解决方案1】:

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

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

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

    【讨论】:

    • 我确实修改了 BFS,与您所说的非常相似。它确实有效,并感谢您对另一种方法的解释。我生成了一堆具有不同数量的顶点和边的随机图作为测试用例(100,200,500,1000,2000 图)。之后,我对这些图表使用了 BFS 方法。但是当我使用具有 12 个或以上顶点的图形时,程序会继续运行并且不提供任何输出。我使用了 100 个带有 15 个顶点的图作为输入,并等待了大约 8-9 个小时,但程序仍在运行。这正常吗?
    • 在最坏的情况下,时间复杂度应该类似于 n^k,所以如果您正在寻找长度为 k = n - 1 或接近该长度的路径,那么它会很快上升,是的。
    • 我对算法的复杂性有一些问号,但我会自己弄清楚。你的解释对我帮助很大。感谢您的帮助,我很感激。 @kaya3
    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多