Dijkstra会不会走一条路?

时间:2017-04-25 07:08:42

标签: dijkstra cyclic-graph

enter image description here

注意:没有负成本。

我正在考虑在使用Dijkstra的路由中实现掉头。 Dijkstra会不会推荐路线A-B-C-B-D而不是A-B-D?当第一次遇到B时,B在访问其邻居后被标记为已访问,因此从B-C-B循环将永远不会被视为

在这种情况下,Dijkstra从不推荐结果中的周期?

2 个答案:

答案 0 :(得分:0)

它的任务是找到最短(最低成本)路径......

如果边权重大于零,则不会有周期 在边缘权重等于零的情况下,它可能发生,但在你的情况下没有任何意义

答案 1 :(得分:0)

TL; DR -除非循环上每个边的成本为0,否则不可能不可能。否则,包括最短路径中的循环会增加不必要的成本到最短路径(这意味着它将不再是最短路径)。

背景

Dijkstra的操作是通过维护两组顶点来进行的。一组是已经标记的顶点,另一组是尚未标记的顶点。给定这两个集合,Dijkstra的算法会寻找下一个最便宜的元素以添加到标记顶点列表中,然后将最短路径更新为未标记顶点。

如果已经标记了A-B-C,并且下一个添加的边是C-> B,则B将到达两次,并且从包括循环在内的A到B的成本为[x + p + q]。但是,没有周期就从A到达B的成本显然是[x]。现在,具有周期的从A到D的最短路径是[x + p + q + r],而没有周期的最短路径将是[x + r]。如果p和q都大于0,则我们看到没有循环的路径会更短。

在一般情况下(边的成本为正),永远不会包含循环,因为最短路径会包含不必要的额外成本,以回到循环的起点。

如果掉头实际上是最短的路径:

为使Dijkstra能够进行必要的掉头工作,您只需从C重新开始算法,然后搜索到D的最短路径(因此在路由时会重新计算通知)。另一种解决方案是提前修改基础图。例如,路径A-B-C-B-D将变为A-B-C-Z-D。或者,可以删除C-> B的边缘和B-> D的边缘,并用C-> D的单个边缘替换。