好的,我发布了这个问题,因为这个练习:
我们可以修改Dijkstra的算法,通过将最小值改为最大值来解决单源最长路径问题吗?如果是这样,那么证明你的算法正确。如果没有,那么提供一个反例。
对于本练习或与Dijkstra算法相关的所有事情,我假设图中没有负权重。否则,它没有多大意义,因为即使对于最短路径问题,如果存在负边缘,Dijkstra也无法正常工作。
好的,我的直觉为我解答了:
是的,我认为可以修改。
我只是
distance[w] > distance[v]+weight
更改为distance[w] < distance[v]+weight
然后我做了一些研究来验证我的答案。我找到了这篇文章:
Longest path between from a source to certain nodes in a DAG
首先我认为我的答案是错误的,因为上面的帖子。但我发现上面帖子中的答案可能是错误的。它将单源最长路径问题与最长路径问题混为一谈。
同样在Bellman–Ford algorithm的wiki中,它说得正确:
Bellman-Ford算法计算加权有向图中的单源最短路径。 对于仅具有非负边缘权重的图形,更快的Dijkstra算法也可以解决问题。因此,Bellman-Ford主要用于具有负边缘权重的图形。
所以我认为我的答案是正确的,对吧? Dijkstra真的可以单源最长路径问题,我的修改也是正确的,对吗?
答案 0 :(得分:11)
不,我们不能 1 - 或者至少,不知道多项式减少/修改 - longest path problem是NP-Hard,而dijkstra在多项式时间内运行!< / p>
如果我们可以找到dijsktra的修改来回答多项式时间中的最长路径问题,我们可以导出P=NP
如果没有,那就提供一个反例。
这是一项非常糟糕的任务。计数器示例可以提供特定的修改是错误的,而可能有不同的修改即可。
事实是我们不知道最长路问题是否可以在多项式时间内解决,但一般的假设是 - 它不是。
关于改变放松步骤:
A
/ \
1 2
/ \
B<--1---C
edges are (A,B),(A,C),(C,B)
来自A的dijkstra将首先选择B,然后B永远无法访问 - 因为它超出了distances
的范围。
至少,人们还必须将最小堆更改为最大堆,但它会有一个不同的反例 - 它失败的原因。
(1)可能,也许如果P = NP则可能,但这种可能性很小。
答案 1 :(得分:5)
是的,我们可以。你的答案几乎是正确的。除了一件事。
您假设没有负面重量。在这种情况下,Dijkstra的算法找不到最长的路径。
但如果您假设仅负权重,您可以轻松找到最长的路径。为了证明正确性,只需获取所有权重的绝对值,就可以得到正常权重的通常Dijkstra算法。
答案 2 :(得分:1)
它适用于有向无环图,但不适用于循环图。由于路径将回溯,并且在dijkstra的算法中无法避免这种情况