我知道Dijkstra的算法不能用于负负边缘,因为它可能会弄乱云中已经存在的顶点的距离。
但是,如果有向图不包含循环即有向无环图(DAG),该怎么办?我认为Dijkstra的算法即使在负加权边缘也可以使用,以找到最小的成本路径。
答案 0 :(得分:1)
否,当负重时不能使用。原因是它是一个贪婪算法。一旦选择了最小距离节点,就不会重新考虑该选择。负权重将使算法后面的其他一些节点变低。
这是一个简单的反例:
start -- 1 ----------> end
| ^
\ -- 2 --> x -- -3 --/
在这种情况下,该算法为您提供权重为1的直接路径,而不是通过权重为-1的节点x的较短路径。
答案 1 :(得分:1)
通常,Dijkstra的算法不能用于绘制具有负边长的图形。但是,可能会有特殊情况。如果图形中的所有负边都连接到起点(如果在无向图形中翻转起点和终点,则该终点也适用于终点)。 Dijkstra的算法还将提供最短的路径。
这样做的原因是Dijkstra的算法总是选择距起始节点距离最小的边缘。核心部分是:在非负权重的情况下,在路径中添加更多边,则该路径只会增加(至少不会减少)。但是,如果引入负长度,则在路径中添加更多的边缘可能会导致路径长度减小。
在下面的示例中,如果使用Dijkstra的算法从s到t,则将无法正常工作,因为edge(v,t)会缩短路径的长度。
但是,如果我们使用Dijkstra的算法从t开始到s,它将选择边(v,t)而不是(s,t),然后再选择(s,v)。之所以会起作用,是因为只有入射到起始节点的边为负才不会损害全局最短距离。在后面的迭代中,将仅拾取非负边缘,并且添加更多的边缘肯定会增加长度。
通常来说,可以肯定地说Dijkstra的最短算法不适用于边长为负的图形。
答案 2 :(得分:0)
即使通过找到最低边缘权重(它将是具有负边缘的图形中的最低负数)并添加一个数字(即最低边缘的绝对值)来使负边缘为非负值,也无法使用该算法图中所有边缘的边缘权重
我很好奇使边缘为非负数是否行得通。但这不会和另外this个stackoverflow答案消除了我的怀疑。