Algorithm 我可以使用Dijkstra';带负加权边的DAG上的s算法?

Algorithm 我可以使用Dijkstra';带负加权边的DAG上的s算法?,algorithm,graph,dijkstra,directed-acyclic-graphs,bellman-ford,Algorithm,Graph,Dijkstra,Directed Acyclic Graphs,Bellman Ford,我知道Dijkstra的算法不能用于负权重边,因为它可能会弄乱云中已经存在的顶点的距离 但是,如果有向图不包含一个圈,即有向无环图(DAG),该怎么办?我认为Dijkstra算法甚至可以用负加权边来寻找最小代价路径 否,存在负权重时不能使用。原因是它是一个贪婪的算法。一旦选择了最小距离节点,它不会重新考虑此选择。负权重将允许算法中稍后的其他节点变得更低 下面是一个简单的反例: start -- 1 ----------> end | ^

我知道Dijkstra的算法不能用于负权重边,因为它可能会弄乱云中已经存在的顶点的距离


但是,如果有向图不包含一个圈,即有向无环图(DAG),该怎么办?我认为Dijkstra算法甚至可以用负加权边来寻找最小代价路径

否,存在负权重时不能使用。原因是它是一个贪婪的算法。一旦选择了最小距离节点,它不会重新考虑此选择。负权重将允许算法中稍后的其他节点变得更低

下面是一个简单的反例:

start  -- 1 ----------> end
    |                    ^
    \ -- 2 --> x -- -3 --/

在这种情况下,该算法给出的是权重为1的直接路径,而不是通过权重为-1的节点x的较短路径。

通常,Dijkstra算法不能用于具有负边长度的图形。但是,可能有一种特殊情况。如果图形中的所有负边都连接到起点(如果在无向图形中翻转起点和终点,也适用于终点)。Dijkstra的算法也将提供最短路径

原因是Dijkstra的算法总是选择距离起始节点最小的边。核心部分是:在非负权重的情况下,在路径中添加更多边,该路径只会增加(至少不会减少)。但是,如果引入负长度,则在路径中添加更多边可能会导致路径长度减小

在下面的示例中,如果使用Dijkstra算法从s到t开始,它将不起作用,因为边(v,t)减少了路径的长度

但是,如果我们使用Dijkstra算法从t开始到s,它将拾取边(v,t),而不是(s,t),然后它将拾取(s,v)。它将起作用,因为只有与起始节点相关的边是负的,这不会影响全局最短距离。在以后的迭代中,只拾取非负边,添加更多边肯定会增加长度


一般来说,可以肯定地说,Dijkstra的最短算法在具有负边长度的图中不起作用。

即使通过查找最低边权重(即具有负边的图中的最低负数)使负边变为非负边,也不能使用该算法以及向图形中的所有边添加一个数字,该数字是最低边权重的绝对值


我很好奇使边非负是否可行。但这行不通,其他stackoverflow答案消除了我的疑问。

参考这一条如果有向图不包含循环,那么Dijkstra的算法不会进入无限循环,但最短距离的结果可能不是最短的。“原因是这是一个贪婪的算法。一旦它选择了最小距离节点,它就不会重新考虑这个选择。“事实上,它是这样做的。Dijkstra的大多数实现都有一条类似于“if(dist[u]+weight[u][v]