我知道对于无向图,这个问题是NP完全的,因此我们应该做蛮力检查所有可能的路径。我们该怎么做?请提出一个伪代码,并告诉我该算法的复杂性。
如果有优化,那就太好了!
朴素的方法可以遍历所有可能的顶点排列。
对于每个排列,{v1, ..., vN}请检查是否可以从v1到v2,然后从v2到v3等。如果可以,请在当前路径长度上添加相应的边长。如果不是,请转到下一个排列。
{v1, ..., vN}
v1
v2
v3
这些路径中最长的就是您的答案。
或者,您可以使用递归进行几乎相同的操作。
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)。
O(N * N^N)