我试图通过阅读topcoder文章[1]来理解分配问题的O(N ^ 4)解释。具体来说,我无法理解默认的O(N ^ 5)过程如何转换为O(N ^ 4)。请阅读以下详细信息:
假设分配问题,两组顶点中N个顶点的完整二分图,以及从顶点i到顶点j的边缘成本,由cost [i] [j]表示,即整数,非负。我们试图最小化完美匹配的权重总和(假设有一个)
从[1]
引用O(n ^ 4)算法Step 0)
A. For each vertex from left Set (workers) find the minimal outgoing edge and subtract its weight from all weights connected with this vertex. This will introduce 0-weight edges (at least one).
B. Apply the same procedure for the vertices in the right Set (jobs).
Step 1)
A. Find the maximum matching using only 0-weight edges (for this purpose you can use max-flow algorithm, augmenting path algorithm, etc.).
B. If it is perfect, then the problem is solved. Otherwise find the minimum vertex cover V (for the subgraph with 0-weight edges only), the best way to do this is to use Konig’s graph theorem.
Step 2)
Let delta = min(cost[i][j]) for i not belonging to vertex cover, and j not belonging to vertex cover.
Then, modify the cost matrix as follows:
cost[i][j] = cost[i][j] - delta for i not belonging to vertex cover, and j not belonging to vertex cover.
cost[i][j] = cost[i][j] + delta for i belonging to vertex cover, and j belonging to vertex cover.
cost[i][j] = cost[i][j] otherwise
Step 3)
Repeat Step 1) until problem is solved
据我所知,如果按原样实现上述算法是O(n ^ 5),因为如果我们使用广度优先搜索,则二分图上的最大匹配需要O(n ^ 3),并且整个算法的O(n ^ 2)次迭代,因为每个边在迭代中变为0。
但是,[1]也提到:
在每次迭代中找到步骤1中的最大匹配将导致算法变为O(n ^ 5)。为了避免这种情况,我们可以在每一步修改上一步的匹配,只需要进行O(n ^ 2)次操作,使整个算法成为O(n ^ 4)
这是我不明白的部分。我们如何修改前一个时期的匹配,从而只进行O(N ^ 2)次操作,而不是正常的O(N ^ 3)次迭代,以实现最大的二分匹配?
我也提到了[2],但在该解决方案中,只有一条评论说:
//制作O(n ^ 4),从之前的解决方案开始
我无法理解如何将O(N ^ 5)转换为O(N ^ 4),从以前的解决方案开始究竟是什么意思? 有人可以解释使用[1]中引用的算法,如何修改它以在O(N ^ 4)中运行?伪代码将是最受欢迎的。
[2] http://algs4.cs.princeton.edu/65reductions/Hungarian.java
先谢谢。