增广路径算法 - 最大匹配

时间:2014-08-27 05:53:32

标签: matching bipartite

我正在阅读扩充路径或Kuhn算法,以在未加权的二分图中找到最大匹配大小。

该算法尝试在不匹配的顶点处找到开始和结束的交替路径(由交替的不匹配和匹配的边缘组成)。如果找到交替路径,则路径会增加,匹配计数会增加1.

我可以理解算法,但是我在理解它通常实现的方式时遇到了问题。以下是参考实现 - https://sites.google.com/site/indy256/algo/kuhn_matching2

在每个阶段,我们应该尝试找到从左边不匹配的顶点开始的交替路径。但是,在给定的实现中,在每次迭代中,我们不是尝试将所有不匹配的顶点作为可能的起始位置,而是仅从一个不匹配的顶点开始搜索,如下面的代码所示 -

for (int u = 0; u < n1; u++) {
      if (findPath(graph, u, matching, new boolean[n1]))
        ++matches;
    } 

这样,左边的一个顶点,在迭代过程中不匹配,永远不会再次尝试。我无法理解为什么这是最佳的?

2 个答案:

答案 0 :(得分:1)

足以证明算法结束后不会有任何增量路径。由于没有增量路径意味着最大流量。让我们说A [i]离开我的顶点,而B [i]就是我的顶点。

如果A [i]已匹配,则它将在任何扩充路径中保持匹配。

所以,我们唯一担心的是当我们考虑A [i]并且发现没有匹配但是在for循环中的一些迭代之后,A [i]突然有了新的增强路径。我们将证明它永远不会发生。

让我们考虑A [i]之前没有增广路径,并将S表示为dfs(i)可以访问的顶点集合。之后只有两种方法可以将新顶点(之前不在S中)包含在S中。

  1. 对于S中的某些A [x],边A [x] - B [y]从匹配变为不匹配(B [y]将包含在S中)

    矛盾。因为我们应该找到增强路径B [y] - A [x] - ... - Sink,但是Sink不在S中所以我们不能这样做。

  2. 对于S中的某些B [y],边B [y] - A [x]从不匹配变为匹配(A [x]将包含在S中)

    再次出现矛盾。这一次,我们应该找到增加路径A [x] - B [y] - ... - Sink,但是再一次,我们无法从B [y]到达Sink。

  3. 由于上述原因,不可能意外地留下意味着最大流量的增强路径。

答案 1 :(得分:0)

根据我的理解,该算法试图找到每个左顶点u(从0到n1-1)的增广路径。如果存在这样的路径,则可以将u添加到匹配中,从而保持匹配中所有先前添加的顶点。如果不存在这样的路径,则无法将u添加到匹配中。这是从扩充路径的特殊属性开始的。

当我们为每个u检查这个时,我们发现可以添加到匹配的最大顶点数,从而产生最优保证。