给定具有一个negeative边缘(u,v)的有向加权图,找到最短路径(s,t)

时间:2017-06-03 12:07:45

标签: algorithm graph bellman-ford

鉴定:定向加权图G(V,E)和s,tV的顶点,除了边(u,v)之外,所有边都是正的是否定的。

问题:从s到t找到最短路径(含义:权重最小)。

我的解决方案:好吧,因为我们有一个负面优势,我们应该使用Bellman-Ford的算法。做n-1"放松"在边缘上,如果在n'迭代中出现问题,则会出现一个周期 - 因此返回false。否则,返回从st的最短路径。

另一个解决方案:使用Dijkstra,并通过保存d(u)并传递负边缘(u,v)并执行"放松"来更改它我们再次在所有边缘上没有负边缘,如果距离改变了,我们有一个周期,否则一切都很好并返回最短路径。

注意:我显然不确定我的解决方案,有一个负面优势的事实是棘手的,任何想法?

注2:为了让它变得有趣,你不能使用Bellman-Ford

1 个答案:

答案 0 :(得分:2)

您可以使用负边缘的信息来创建有效的算法。

我们将a表示为负边缘的源节点,b表示目标节点,因此我们有负边a -> b

从节点s到节点t有两种路径:

  1. a->b不是路径的一部分;
  2. 边缘a->b是路径的一部分。
  3. 我们打算找到从st的最短路径,我们将通过找到上述两种类型中的每一种的最短路径来实现。

    通过简单地在去除了负边缘的修改图上应用Dijkstra算法,可以找到类型(1)的最小路径。

    对于类型(2),我们现在对从包含边s的{​​{1}}到t的最短路径感兴趣。此路径必须采用以下格式:a->b

    如果图中没有负周期,那么边s -> ... -> a -> b -> ... -> t应该只在最短路径中出现一次(请参阅本答案的最后部分以讨论负循环)。

    在这种情况下(没有负循环),我们可以应用Dijkstra算法两次,首先找到从a->bs的最短路径;然后找到从ab的最短路径。在这两种情况下,Dijkstra算法应该应用于通过去除负边t而修改的图形。

    关于负循环。如果存在负循环,在同一节点中开始和结束且成本为负的路径,并且该节点位于从a->bs的路径上,然后,从ts的最短路径不存在。实际上,在这种情况下,通过多次包括负成本周期,可以使ts的成本任意小。

    然而,可以再次使用Dijkstra算法确定图中是否存在这样的循环。请注意,由于存在单个负边t,因此负循环需要包含它。因此,我们需要有一条从a->bb的路径,其总费用小于a权重的绝对值。我们可以通过应用Dijkstra算法来检查是否存在这样的路径,其中包括起始节点a->b和目标b。同样,Dijkstra的算法应该应用于删除了a边缘的图形(我们对路径中没有它感兴趣),因此所有边缘权重都是正的。