使用最大二分匹配进行分配的匈牙利算法

时间:2017-02-20 14:48:22

标签: algorithm

我试图通过阅读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)中运行?伪代码将是最受欢迎的。

[1] https://www.topcoder.com/community/data-science/data-science-tutorials/assignment-problem-and-hungarian-algorithm/

[2] http://algs4.cs.princeton.edu/65reductions/Hungarian.java

先谢谢。

0 个答案:

没有答案