我正在阅读增广路径或库恩算法,以在未加权的二分图中找到最大匹配大小。
该算法试图找到一条交替路径(由交替的不匹配和匹配的边组成)在不匹配的顶点处开始和结束。如果找到交替路径,则增加路径并且匹配计数增加 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;
}
这样,在其迭代期间不匹配的左侧顶点将永远不会再次尝试。我不明白为什么这是最优的?