小编典典

如何在图中找到最长的简单路径?

algorithm

我知道对于无向图,这个问题是NP完全的,因此我们应该做蛮力检查所有可能的路径。我们该怎么做?请提出一个伪代码,并告诉我该算法的复杂性。

如果有优化,那就太好了!


阅读 280

收藏
2020-07-28

共1个答案

小编典典

朴素的方法可以遍历所有可能的顶点排列。

对于每个排列,{v1, ..., vN}请检查是否可以从v1v2,然后从v2v3等。如果可以,请在当前路径长度上添加相应的边长。如果不是,请转到下一个排列。

这些路径中最长的就是您的答案。


或者,您可以使用递归进行几乎相同的操作。

path = 0
bestPath = 0
used = new bool[N] // initialize with falses
for(u = 0; u < N; u++)
    Path(u); // build paths starting from u
print bestPath

哪里

Path(u)
    used[u] = true
    foreach v in neighborhood(u)
        if(!used[v])
            path += distance(u, v)
            bestPath = max(bestPath, path)
            Path(v)
            path -= distance(u, v)
    used[u] = false

时间的复杂性令人震惊O(N * N^N)

2020-07-28