【问题标题】:Can I use Dijkstra's algorithm on DAG with negative weighted edges?我可以在带有负加权边缘的 DAG 上使用 Dijkstra 算法吗?
【发布时间】:2019-05-01 02:36:04
【问题描述】:

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

但是,如果有向图不包含循环,即有向无环图 (DAG),该怎么办?我认为即使使用负加权边缘也可以使用 Dijkstra 算法来找到最小成本路径。

【问题讨论】:

  • 如果有向图不包含循环,那么 Dijkstra 算法不会进入无限循环,但最短距离的结果可能不是最短的。

标签: algorithm graph dijkstra directed-acyclic-graphs bellman-ford


【解决方案1】:

不,当有负权重时不能使用。原因是它是一个贪心算法。一旦它选择了最小距离节点,它就不会重新考虑这个选择。负权重将允许算法后面的某个其他节点变低。

这是一个简单的反例:

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

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

【讨论】:

  • "原因是它是一个贪心算法。一旦它选择了最小距离节点,它就不会重新考虑这个选择。"事实上,确实如此。 Dijkstra 的大多数实现都有类似“if (dist[u] + weight[u][v]
  • @WeakestTopology 您忽略了“一旦选择了最小距离节点”部分。这个决定永远不会被重新考虑。
  • 每次迭代都会选择一个最小距离节点,这不是问题。在您的示例中,它将以“start”开头,将“end”和“x”放入队列中,选择“end”,从队列中删除“end”,选择“x”,放松“end”并将其放入再次排队。它只会变慢。
  • 这一行 "if (dist[u] + weight[u][v]
  • @WeakestTopology 这不是我理解 Dijkstra 算法的方式。
【解决方案2】:

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

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

在下面的例子中,如果你从 s 开始到 t,使用 Dijkstra 的算法,它是行不通的,因为 edge(v, t) 减少了路径的长度。

An example

但是,如果我们使用 Dijkstra 算法从 t 开始到 s,它将选择边缘 (v, t) 而不是 (s,t),然后它会选择 (s, v)。它会起作用,因为只有入射到起始节点的边缘是负的,不会损害全局最短距离。在后面的迭代中,只会选择非负边,添加更多边肯定会增加长度。

一般来说,可以肯定地说,Dijkstra 的最短算法不适用于具有负边长的图。

【讨论】:

  • 那个例子不是 DAG,就像 op 要求的那样。
【解决方案3】:

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

我很好奇使边缘为非负数是否可行。但它不会,this 其他 stackoverflow 答案消除了我的疑问。

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 2018-11-15
    • 2021-08-12
    • 2011-10-11
    • 1970-01-01
    • 2011-04-19
    相关资源
    最近更新 更多