具有负边缘的Dijkstra离开源节点

时间:2012-10-10 00:00:36

标签: algorithm dijkstra

Dijkstra的算法失败,因为在图中我们有负权重的边。然而,对于这个规则,有一个例外:如果在有向非循环图中,只有离开源节点的边是负的(所有其他边都是正的),那么我们就可以成功地使用Dijkstra算法。

现在我的问题是,如果在上面的例外中图表有一个周期怎么办?我相信Dijkstra不会工作,但我无法想出一个有循环的有向图的例子,唯一的负边是离开源节点的那些不能与Dijkstra一起工作的。有人可以举个例子吗?

1 个答案:

答案 0 :(得分:7)

在你描述的场景中,Dijkstra的算法可以正常工作。

因为它贪婪地选择在每一步“关闭”哪个节点,并且从不重新打开一个封闭的节点,所以它在负权重的一般情况下失败的原因。

现在,假设源sk个边缘,到k个不同的节点。
让它们的顺序为v_1, v_2, ..., v_kv_1是最小的)。请注意,对于每个v_iv_ji < j - sv_iv_j之间没有“更好”的路径“然后费用v_i,因此 - 调查这些第一个节点的顺序永远不会改变。 (并且因为它没有改变,所以在确实找到最短路径之前,以后的节点不会被输入“关闭”。)

因此,总的来说 - 没有伤害 - 一旦边缘处于“封闭”状态 - 你将永远找不到“更短”的路径,因为负边缘只来自源头。


在此我假设您的问题中的source表示d_in(source)=0,与DAG中的“来源”相同。
如果你的意思是在源顶点之外,那么它可能是一个问题,因为查看2个顶点图形使得w(s,t) = -2, w(t,s)=1 - 图形中存在负循环。因此,为了使上述解释起作用 - 您必须假设d_in(s) = 0