好的,首先我知道Dijkstra不适用于负重量,我们可以使用Bellman-ford代替它。但是在一个问题中,我给它说明所有边都有从0到1的权重(不包括0和1)。而路径的成本实际上就是产品。
所以我想的只是记录日志。现在所有的边都是负的。现在我知道Dijkstra不会用于负权重,但在这种情况下,所有边缘都是负数,所以我们不能做一些事情让Dijkstra工作。
我将所有权重乘以-1,但最短路径成为最长路径。
在这种情况下,无论如何我都可以避免使用Bellman-Ford算法。
确切的问题是:“假设对于某些应用,路径的成本等于路径中边缘的所有权重。在这种情况下你会如何使用Dijkstra的算法?边缘的所有权重从0到1(0和1不包括在内)。“
答案 0 :(得分:3)
如果图表上的所有权重都在(0, 1)
范围内,那么总会有一个权重小于1
的周期,因此你将永远陷入这个周期(循环中的每次传递都会减少最短路径的总重量。可能你误解了这个问题,你想要找到最长的路径,或者你不允许两次访问同一个顶点。无论如何,在第一种情况下,即使没有log
修改,dijkstra算法也是绝对适用的。而且我很确定第二种情况不能用多项式复杂度来解决。
答案 1 :(得分:1)
所以你想使用一个函数,比如F
,你将应用于原始图的权重,然后使用Dijkstra算法,你会找到最短的产品路径。我们还要考虑以下图,我们从节点A
和0 < x < y < 1
开始:
在上图中,F(x)
必须小于F(y)
,以便Dijkstra算法正确输出A
的最短路径。
现在,让我们从节点A
重新开始略微不同的图表:
那么Dijkstra的算法将如何运作?
从F(x) < F(y)
开始,我们将在下一步选择节点B
。然后我们将访问剩余的节点C
。 Dijkstra算法将输出从A
到B
的最短路径为A -> B
,从A
到C
的最短路径为A -> C
。
但从A
到B
的最短路径为A -> C -> B
且费用为x * y < x
。
这意味着我们无法找到权重转换函数,并期望Dijkstra算法能够在每种情况下都能运行。
答案 2 :(得分:0)
您写道:
我将所有权重乘以-1然后最短 路径成为最长的路径。
在最短和最长路径之间切换权重。因此1/3
将为3
,5
将为1/5
,依此类推。
答案 3 :(得分:0)
如果您的图表有周期,那么没有最短路径算法会找到答案,因为这些周期总是&#34;负周期&#34;,正如Rontogiannis Aristofanis所指出的那样。
如果您的图表没有周期,您根本不必使用Dijkstra 。
如果它是定向的,它是DAG并且存在线性时间最短路径算法。
如果它是无向的,它就是一棵树,在树上寻找最短的路径是微不足道的。如果你的图表是有针对性的,即使没有周期,Dijkstra仍然不会因为它不适用于负边缘图而工作。
在所有情况下,Dijkstra对您的问题都是一种可怕的算法选择。