图-狄克斯特拉算法求单源最长路径

12

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

我们能通过将最小值改为最大值来修改 Dijkstra 算法以解决单源最长路径问题吗?如果可以,请证明您的算法正确。如果不行,请提供一个反例。

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


好的,我的直觉告诉我:

是的,我认为它可以被修改。

我只需要:

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

然后我进行了一些研究以验证我的答案。我找到了这篇文章:

从源到DAG中某些节点的最长路径

起初我认为我的答案是错误的,因为上面的文章。但我发现可能上面文章中的答案是错误的。它混淆了单源最长路径问题最长路径问题
另外,在Bellman-Ford算法的维基中,它正确地说道:

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

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

@Kristo,请你看一下好吗? - Jackson Tale
3个回答

10
不,我们不能 - 或者至少目前没有已知的多项式约简/修改方法 - 最长路径问题NP-难题, 而 Dijkstra 算法在多项式时间内运行!
如果我们能找到一种修改 Dijkstra 算法以在多项式时间内回答最长路径问题的方法,我们就可以推导出 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
啊,好的,我想我犯了一个错误。如果单源最长路径问题可以解决,那么我们只需要对于每个顶点进行单源最长路径,然后将它们全部比较,然后解决最长路径问题。但这是不可能的,因为最长路径问题是NP问题。好的,我猜我想错了。 - Jackson Tale
1
@JacksonTale:Dijkstra算法背后的思想是进行局部松弛。请注意,在Dijkstra算法中,当选择并从节点列表中删除具有最小距离的节点时,这是可以的,我们将永远不需要再次修改它,而对于最大问题-则不是如此。 - amit
1
@JacksonTale:我相信有一种修改方法,但我暂时想不起来了。然而,正如你已经知道的那样,我更喜欢将问题简化为现有算法,而不是修改算法。在这种情况下,我会创建一个新的权重函数 w'(e) = -w(e),并使用 w' 调用 Bellman Ford 算法。由于图是 DAG,因此没有循环,特别是没有负循环,BF 将根据 w' 返回最短路径,这也是根据 w 的最长路径!你觉得怎么样?这个方法适合你的问题吗? - amit
2
这个答案不准确。一般来说,Dijkstra算法不能用于查找最长路径,但是有一部分图形可以使用Dijkstra算法查找最长路径:如果给定图形G上的所有边都是非正数,则可以通过否定所有边将G转换为-G。在这种情况下,Dijkstra在-G中找到的最短路径对应于G中的最长路径。 - Ari
@amit:有两个问题需要考虑:经典的最短路径Dijkstra算法仅适用于具有非负边缘的图形,而不是所有图形,因此问题从一开始就不是普遍的。同样,可以使用Dijkstra在具有非正边缘的图形中使用“-G”来查找最长路径。因此,这两种情况是对称和可比较的。其次,查找最长路径实际上并不是NP-Complete。众所周知,NP-complete是查找“简单”的最短路径,这引起了很多混乱:https://dev59.com/rK_la4cB1Zd3GeqP0vKJ#53399638 - Ari
显示剩余11条评论

6

是的,我们可以。你的答案几乎正确,只有一个问题。

你假设没有负权重。在这种情况下,Dijkstra算法无法找到最长路径。

但是,如果你假设只有负权重,你可以很容易地找到最长路径。为了证明正确性,只需取所有权重的绝对值,你就得到了具有正权重的通常Dijkstra算法。


1
我认为你的答案有些巧妙。如果我只考虑负权重,那么最长路径就像“所有正权重的最短路径”。我不认为这是练习所要求的。 - Jackson Tale
@JacksonTale,是的,这只是一个技巧。但从练习文本中并不清楚它的含义。否则,amit的答案非常好。 - Evgeny Kluev
谢谢您的回答。我想这个练习的真正意思是针对最长路径问题的。我的错误是加入了这样的假设。 - Jackson Tale
使用Dijkstra算法处理非正权重的想法非常有趣。特别是当我们需要在所有边缘为负或零权重的图G中找到最长路径时,将Dijkstra算法应用于转换后的图G'=(-G)比使用Bellman-Ford算法更明智,以实现更好的运行时间。 - KGhatak

1
它适用于有向无环图,但不适用于循环图。由于路径会返回并且在Dijkstra算法中无法避免这种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接