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

时间:2014-02-19 12:24:47

标签: algorithm graph longest-path

我知道对于非有向图这个问题是NP完全的,因此我们应该做Brute Force来检查所有可能的路径。我们怎么做到这一点?请建议一个伪代码并告诉我该算法的复杂性。

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

2 个答案:

答案 0 :(得分:4)

天真的方法可以贯穿所有可能的顶点排列。

对于每个排列{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)

答案 1 :(得分:2)

如果您的图表是定向和非循环的特殊情况,您可以执行动态编程方法,例如描述here的方法。你基本上按照拓扑顺序对图形进行排序,然后按照拓扑顺序对每个节点V进行排序,检查所有邻居并更新它们的“距离”值,如果它大于已经记忆的“距离”(用-infinity或其他东西初始化)。 / p>

否则,在一般情况下,问题确实是NP完全的,因为它减少到哈密顿循环。你可以做的一件事是否定所有边缘并尝试贝尔曼 - 福特算法。但要注意,这对于负循环并不好。