图 - Dijkstra的单源最长路径

时间:2012-05-05 14:21:49

标签: algorithm data-structures graph dijkstra

好的,我发布了这个问题,因为这个练习:

  

我们可以修改Dijkstra的算法,通过将最小值改为最大值来解决单源最长路径问题吗?如果是这样,那么证明你的算法正确。如果没有,那么提供一个反例。

对于本练习或与Dijkstra算法相关的所有事情,我假设图中没有负权重。否则,它没有多大意义,因为即使对于最短路径问题,如果存在负边缘,Dijkstra也无法正常工作。


好的,我的直觉为我解答了:

是的,我认为可以修改。

我只是

  1. 将距离数组初始化为MININT
  2. distance[w] > distance[v]+weight更改为distance[w] < distance[v]+weight

  3. 然后我做了一些研究来验证我的答案。我找到了这篇文章:

    Longest path between from a source to certain nodes in a DAG

    首先我认为我的答案是错误的,因为上面的帖子。但我发现上面帖子中的答案可能是错误的。它将单源最长路径问题最长路径问题混为一谈。

    同样在Bellman–Ford algorithm的wiki中,它说得正确:

      

    Bellman-Ford算法计算加权有向图中的单源最短路径。 对于仅具有非负边缘权重的图形,更快的Dijkstra算法也可以解决问题。因此,Bellman-Ford主要用于具有负边缘权重的图形。

    所以我认为我的答案是正确的,对吧? Dijkstra真的可以单源最长路径问题,我的修改也是正确的,对吗?

3 个答案:

答案 0 :(得分:11)

不,我们不能 1 - 或者至少,不知道多项式减少/修改 - longest path problemNP-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的算法中无法避免这种情况