![](/img/trans.png)
[英]How to set exactly one edge to zero in directed weighted graph in order to find shortest path?
[英]Given directed weighted graph that has one negeative edge (u,v), find shortest path (s,t)
给定:有向加权图G(V,E)和s,t
是V
顶点,除边(u,v)
为负之外,所有边均为正。
问题:找到从s到t的最短路径( 含义:权重最小 )。
我的解决方案:嗯,因为我们有一个消极的边缘,所以我们应该使用Bellman-Ford算法。 在边缘执行n-1
“松弛”,如果在第n
个迭代中存在问题,则存在一个循环-因此返回false。 否则,返回从s
到t
的最短路径。
另一个解决方案:使用Dijkstra,并通过保存d(u)并在负边缘(u,v)上传递并进行“松弛”来对其进行一些更改,然后在没有负边缘的情况下再次在所有边缘上移动被改变,我们有一个循环,否则一切都好,返回最短的路径。
注意:我显然不确定我的解决方案,因为存在一个负面影响这一事实很棘手,有什么想法吗?
注意2:为了使它有趣, 您不能使用Bellman-Ford 。
您可以使用存在单个负边缘的信息来创建有效的算法。
让我们表示作为a
下降沿的源节点,和b
目的节点,所以我们有下降沿a -> b
。
从节点s
到节点t
的路径有两种:
a->b
不是路径的一部分; a->b
是路径的一部分。 我们打算找到从s
到t
的最短路径,我们将通过找到上述两种类型中的每一种的最短路径来做到这一点。
沿着类型(1)的最小路径可以通过简单地将Dijkstra算法应用到删除了负边缘的修改图形上来找到。
对于类型(2),我们现在对从s
到t
的最短路径感兴趣,该路径包含边a->b
。 该路径必须采用以下形式: s -> ... -> a -> b -> ... -> t
。
如果图中没有负循环,则边a->b
应该在最短路径中仅出现一次(请参见此答案的最后部分,以讨论负循环)。
在这种情况下(没有负循环),我们可以应用Dijkstra算法两次,第一次找到最短路径s
到a
; 然后找到从b
到t
的最短路径。 在这两种情况下,都应将Dijkstra算法应用于通过删除负边a->b
修改的图。
关于负循环。 如果有开始和在同一节点中结束,并且具有负成本的负周期, 即路径,该节点是从路径上s
到t
,然后从最短路径s
到t
不存在。 实际上,在这种情况下,通过多次包含负成本周期,可以使s
到t
的成本任意减小。
但是,可以再次使用Dijkstra算法确定图形中是否存在这样的循环。 请注意,由于存在单个负边缘a->b
,因此负循环需要包含它。 因此,我们需要一条从b
到a
的路径,其总成本小于a->b
的权重的绝对值。 我们可以通过应用Dijkstra的算法(起始节点为b
,目的地为a
来检查是否存在这样的路径。 同样,Dijkstra的算法应在删除了a->b
边的情况下应用于图形(我们对将其放在路径中不感兴趣),因此所有边权重均为正。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.