Dijkstra的算法 - DAG最短路径,只有负成本

时间:2017-05-25 18:15:17

标签: algorithm shortest-path dijkstra directed-acyclic-graphs topological-sort

我在非循环有向图中寻找源(s)和sink(t)之间的最短路径。该图具有拓扑顺序(时间)。所有边都有或负或空成本。 是否仍然可以使用Dijkstra算法? 该图表如下所示:graph example

通常Dijkstra不能使用负权重,因为节点只被探索一次(假设成本只能增加)。 在这种情况下,由于我只有负(或空成本),并且成本只能降低,如果我按照拓扑顺序探索图形,确保路径是最优的?

谢谢

2 个答案:

答案 0 :(得分:2)

是的,这将是最佳的 - 但这不是Dijkstra的算法。

Dijkstra的算法根据当前的权重指定如何探索节点。来自original article

  

第二组的最短分支将从此集中删除并添加到   结果,一个节点从集合B转移到集合I.

您所描述的是一种不同的解决方案,并且有效:

D[source] = 0
D[v] = min {D[u] + w(u,v) | u in V}

现在,由于您遵循拓扑顺序,您可以通过归纳证明上述公式是正确的 - 因为假设归纳假设对u之前探索的所有v都是正确的,那么结论是D[v]也是正确的(因为它不会被重新打开)。

P.S。这个证明甚至不需要假设只有负权重,如果权重是混合的,那么效果很好,所以同样的解决方案也适用。

答案 1 :(得分:0)

因此,您所看到的是具有正权重的图表上的最长路径(您只需要采用每个值的相反值)。对于一般图形,这个问题实际上是NP难的,但如果图形是有向无环图,则它在线性时间内变得可解。例如,here给出了一个非常好的解释。