Floyd-Warshall 算法的最小权重循环
Posted
技术标签:
【中文标题】Floyd-Warshall 算法的最小权重循环【英文标题】:Minimum Weight Cycles with Floyd-Warshall Algorithm 【发布时间】:2014-05-09 10:43:31 【问题描述】:“让 G 是一个没有负循环的有向加权图。设计一种算法来找到 G 中的最小权重循环,其运行时间复杂度为 O(|V|^3)。”
以上是我在课程作业中一直在研究的一个问题。当我第一次阅读它时,我立即认为 Floyd-Warshall 算法可以解决这个问题 - 主要是因为 F-W 在 O(|V|^3) 时间内运行,并且它适用于没有负循环的正负加权图。不过,我很快就想起了 F-W 旨在找到图的最短路径,而不是最小权重循环。
我在这个问题上是否正确?是否可以修改 Floyd-Warshall 算法以在图中找到最小权重循环?
【问题讨论】:
是的,你在正确的轨道上。包含顶点 v 的最小权重循环由从 _____ 开始的最小权重 _____ 组成,然后是 a[n] _____。填空:) 我不知道上面的空白应该是什么,但循环是从顶点到自身的(非平凡的)路径。您只需调整 FW 的初始设置即可获得所需的内容。 @G.Bach 我认为黑客的意思是,如果您首先解决了所有对最短路径,则可以在 O(n^3) 内构造最小循环。如果我们想找到一个没有重复节点的简单循环,那就更难了 @NiklasB。我认为将每个顶点一分为二就足够了,将它们与零权重边连接,并以通常为此操作完成的方式调整所有边。然后我们运行 Floyd-Warshall,寻找从 v_o 到 v_i 的最短路径,其中 v 覆盖所有顶点。由于我不记得 Floyd-Warshall 是否会为您提供不简单的路径,因此一旦我们有了路径,我们就可以轻松地在线性时间内去除其中的所有(零权重)循环。 @G.Bach:这将适用于像这样的有向图,前提是您在每种情况下都添加了从 v_i 到 v_o 的边。 (但请尽量不要对家庭作业问题给出完整的答案......) 【参考方案1】:我认为你很接近。一旦你在 O(|V|^3) 中进行 FW 循环,你就有了每对顶点之间最短路径的权重,我们称之为 D(i, j)。现在我们的主要问题的解决方案如下:对将处于循环中的顶点进行暴力破解,比如说它是 X。还有对 Y 的暴力破解,这将是循环中的最后一个顶点,在 X 本身之前。这个循环的权重显然是 D(X, Y) + W(Y, X)。然后,您只需选择具有最小值的那个。这显然是一个正确的答案,因为: (1) D(X,Y)+D(Y,X) 的所有这些值代表某个(可能是非简单的)循环的权重; (2) 如果最优循环是某个a->...->b->a,那么我们在X=a, Y=b时考虑;
要重构答案,首先您需要跟踪哪个 X、Y 给了我们最佳结果。一旦我们有了这个 X 和 Y,剩下的唯一事情就是找到从 X 到 Y 的最短路径,这可以通过多种方式完成。
【讨论】:
以上是关于Floyd-Warshall 算法的最小权重循环的主要内容,如果未能解决你的问题,请参考以下文章