Dijkstra的负权重算法

时间:2015-04-18 08:51:51

标签: algorithm dijkstra shortest-path

好的,首先我知道Dijkstra不适用于负重量,我们可以使用Bellman-ford代替它。但是在一个问题中,我给它说明所有边都有从0到1的权重(不包括0和1)。而路径的成本实际上就是产品。

所以我想的只是记录日志。现在所有的边都是负的。现在我知道Dijkstra不会用于负权重,但在这种情况下,所有边缘都是负数,所以我们不能做一些事情让Dijkstra工作。

我将所有权重乘以-1,但最短路径成为最长路径。

在这种情况下,无论如何我都可以避免使用Bellman-Ford算法。

确切的问题是:“假设对于某些应用,路径的成本等于路径中边缘的所有权重。在这种情况下你会如何使用Dijkstra的算法?边缘的所有权重从0到1(0和1不包括在内)。“

4 个答案:

答案 0 :(得分:3)

如果图表上的所有权重都在(0, 1)范围内,那么总会有一个权重小于1的周期,因此你将永远陷入这个周期(循环中的每次传递都会减少最短路径的总重量。可能你误解了这个问题,你想要找到最长的路径,或者你不允许两次访问同一个顶点。无论如何,在第一种情况下,即使没有log修改,dijkstra算法也是绝对适用的。而且我很确定第二种情况不能用多项式复杂度来解决。

答案 1 :(得分:1)

所以你想使用一个函数,比如F,你将应用于原始图的权重,然后使用Dijkstra算法,你会找到最短的产品路径。我们还要考虑以下图,我们从节点A0 < x < y < 1开始:

Second graph

在上图中,F(x)必须小于F(y),以便Dijkstra算法正确输出A的最短路径。

现在,让我们从节点A重新开始略微不同的图表:

First graph

那么Dijkstra的算法将如何运作?

F(x) < F(y)开始,我们将在下一步选择节点B。然后我们将访问剩余的节点C。 Dijkstra算法将输出从AB的最短路径为A -> B,从AC的最短路径为A -> C

但从AB的最短路径为A -> C -> B且费用为x * y < x

这意味着我们无法找到权重转换函数,并期望Dijkstra算法能够在每种情况下都能运行。

答案 2 :(得分:0)

您写道:

  

我将所有权重乘以-1然后最短   路径成为最长的路径。

在最短和最长路径之间切换权重。因此1/3将为35将为1/5,依此类推。

答案 3 :(得分:0)

如果您的图表有周期,那么没有最短路径算法会找到答案,因为这些周期总是&#34;负周期&#34;,正如Rontogiannis Aristofanis所指出的那样。

如果您的图表没有周期,您根本不必使用Dijkstra

如果它是定向的,它是DAG并且存在线性时间最短路径算法。

如果它是无向的,它就是一棵树,在树上寻找最短的路径是微不足道的。如果你的图表是有针对性的,即使没有周期,Dijkstra仍然不会因为它不适用于负边缘图而工作。

在所有情况下,Dijkstra对您的问题都是一种可怕的算法选择。

相关问题