繁体   English   中英

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

[英]Given directed weighted graph that has one negeative edge (u,v), find shortest path (s,t)

给定:有向加权图G(V,E)和s,tV顶点,除边(u,v)为负之外,所有边均为正。

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

我的解决方案:嗯,因为我们有一个消极的边缘,所以我们应该使用Bellman-Ford算法。 在边缘执行n-1 “松弛”,如果在第n个迭代中存在问题,则存在一个循环-因此返回false。 否则,返回从st的最短路径。

另一个解决方案:使用Dijkstra,并通过保存d(u)并在负边缘(u,v)上传递并进行“松弛”来对其进行一些更改,然后在没有负边缘的情况下再次在所有边缘上移动被改变,我们有一个循环,否则一切都好,返回最短的路径。

注意:我显然不确定我的解决方案,因为存在一个负面影响这一事实很棘手,有什么想法吗?

注意2:为了使它有趣, 您不能使用Bellman-Ford

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

让我们表示作为a下降沿的源节点,和b目的节点,所以我们有下降沿a -> b

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

  1. 边缘a->b不是路径的一部分;
  2. 边缘a->b是路径的一部分。

我们打算找到从st的最短路径,我们将通过找到上述两种类型中的每一种的最短路径来做到这一点。


沿着类型(1)的最小路径可以通过简单地将Dijkstra算法应用到删除了负边缘的修改图形上来找到。


对于类型(2),我们现在对从st的最短路径感兴趣,该路径包含边a->b 该路径必须采用以下形式: s -> ... -> a -> b -> ... -> t

如果图中没有负循环,则边a->b应该在最短路径中仅出现一次(请参见此答案的最后部分,以讨论负循环)。

在这种情况下(没有负循环),我们可以应用Dijkstra算法两次,第一次找到最短路径sa ; 然后找到从bt的最短路径。 在这两种情况下,都应将Dijkstra算法应用于通过删除负边a->b修改的图。


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

但是,可以再次使用Dijkstra算法确定图形中是否存在这样的循环。 请注意,由于存在单个负边缘a->b ,因此负循环需要包含它。 因此,我们需要一条从ba的路径,其总成本小于a->b的权重的绝对值。 我们可以通过应用Dijkstra的算法(起始节点为b ,目的地为a来检查是否存在这样的路径。 同样,Dijkstra的算法应在删除了a->b边的情况下应用于图形(我们对将其放在路径中不感兴趣),因此所有边权重均为正。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM