Finding a "positive cycle"

时间:2015-10-29 15:52:24

标签: algorithm matrix graph

Suppose we E is an nxn matrix where E[i,j] represents the exchange rate from currency i to currency j. (How much of currency j can be obtained with 1 of currency i). (Note, E[i,j]*E[j,i] is not necessarily 1).

Come up with an algorithm to find a positive cycle if one exists, where a positive cycle is defined by: if you start with 1 of currency i, you can keep exchanging currency such that eventually you can come back and have more than 1 of currency i.


I've been thinking about this problem for a long time, but I can't seem to get it. The only thing I can come up with is to represent everything as a directed graph with matrix E as an adjacency matrix, where log(E[i,j]) is the weight between vertices i and j. And then you would look for a cycle with a negative path or something. Does that even make sense? Is there a more efficient/easier way to think of this problem?

1 个答案:

答案 0 :(得分:2)

首先,记录汇率(这不是绝对必要的,但这意味着我们可以像往常一样谈论“增加长度”)。然后,您可以对Floyd-Warshall algorithm进行略微修改,以查找可能非简单路径的长度(即可能多次循环回自身的路径,并且位于不同的位置)每对顶点之间至少与它们之间最长的简单路径一样长。唯一需要做的更改是翻转比较的符号,以便我们始终查找最长的路径(下面有更多详细信息)。最后,您可以查看所有O(n ^ 2)个顶点u和v,获取每个方向上2条路径长度的总和(从u到v,从v到u)。如果其中任何一个是> 0然后你发现了一个(可能是非简单的)周期,其总体汇率> 1.总的来说,算法的FW部分占主导地位,使得 O(n ^ 3) - 时间。

通常,尝试使用像FW这样的算法来查找最大 - 权重路径的问题是,它可能将两个共享一个或多个顶点的子路径连接在一起,而我们通常不会想要这个。 (当在没有负循环的图中查找最小 - 长度路径时,这种情况不可能发生,因为这样的路径必然包含可以被移除的正权重循环,因此它永远不会选择最佳。)如果我们正在寻找最大 - 重量简单周期,这将是一个问题;在这种情况下,为了解决这个问题,我们需要为顶点的每个子集考虑一个单独的子问题,这会将时间和空间复杂度推高到O(2 ^ n)。幸运的是,我们只关心找到一些正权重循环,并且很容易看出如果FW找到的路径碰巧多次使用某个顶点,那么它必须包含一个非负重量循环 - 可以被移除(如果它具有重量0),或者(如果它具有重量> 0)本身就是“正确答案”!

如果你关心找到一个简单的循环,这很容易在FW报告的路径长度线性的最后一步中完成(顺便说一句,可能是O(2 ^ | V |) - 如果所有路径都具有正长度,那么所有“最佳”长度将在每个最外层迭代时加倍 - 但这在这里不太可能发生)。取FW结果所暗示的最优路径对(每条路径可以通过常规方式计算,通过保持每个顶点对(i,j)的“最佳前驱”值为k的表,并简单地沿着它走,为每个顶点分配您访问到目前为止的长度的运行总计,直到您到达已经访问过的顶点。此时,要么currentTotal - totalAtAlreadyVisitedVertex > 0,在这种情况下,您刚刚找到的循环具有正重量并且您已完成,或者此差异为0,在这种情况下,您可以从路径中删除与此循环对应的边缘。像往常一样继续。