鉴定:定向加权图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 。
答案 0 :(得分:2)
您可以使用单负边缘的信息来创建有效的算法。
我们将a
表示为负边缘的源节点,b
表示目标节点,因此我们有负边a -> b
。
从节点s
到节点t
有两种路径:
a->b
不是路径的一部分; a->b
是路径的一部分。我们打算找到从s
到t
的最短路径,我们将通过找到上述两种类型中的每一种的最短路径来实现。
通过简单地在去除了负边缘的修改图上应用Dijkstra算法,可以找到类型(1)的最小路径。
对于类型(2),我们现在对从包含边s
的{{1}}到t
的最短路径感兴趣。此路径必须采用以下格式:a->b
。
如果图中没有负周期,那么边s -> ... -> a -> b -> ... -> t
应该只在最短路径中出现一次(请参阅本答案的最后部分以讨论负循环)。
在这种情况下(没有负循环),我们可以应用Dijkstra算法两次,首先找到从a->b
到s
的最短路径;然后找到从a
到b
的最短路径。在这两种情况下,Dijkstra算法应该应用于通过去除负边t
而修改的图形。
关于负循环。如果存在负循环,即在同一节点中开始和结束且成本为负的路径,并且该节点位于从a->b
到s
的路径上,然后,从t
到s
的最短路径不存在。实际上,在这种情况下,通过多次包括负成本周期,可以使t
到s
的成本任意小。
然而,可以再次使用Dijkstra算法确定图中是否存在这样的循环。请注意,由于存在单个负边t
,因此负循环需要包含它。因此,我们需要有一条从a->b
到b
的路径,其总费用小于a
权重的绝对值。我们可以通过应用Dijkstra算法来检查是否存在这样的路径,其中包括起始节点a->b
和目标b
。同样,Dijkstra的算法应该应用于删除了a
边缘的图形(我们对路径中没有它感兴趣),因此所有边缘权重都是正的。