Hopcroft-Karp算法
该算法
不像简单的匹配算法,比如匈牙利最大匹配算法Hopcroft-Karp算法在每一轮迭代中都能找到一个最大的最短扩充路径集。因为这,只有 需要迭代算法。
伪代码
的双分区中定义两组顶点 , 而且 ,节点数量相等。中节点之间的匹配或边集 和节点 被称为 .
该算法分阶段运行,由以下步骤组成。[3]
- 使用一个广度优先搜索求增广路径。它将图的顶点划分为层边的匹配和不匹配。对于搜索,从空闲节点开始 .这形成了分区的第一层。搜索在第一层结束 一个或多个空闲节点在哪里 是达到了。
- 中的空闲节点 都被添加到一个叫做 .这意味着添加到的任何节点 将是增广路径的结束节点——并且是最短的增广路径,因为宽度优先搜索找到最短路径。[4]
- 一旦发现了增广路径,a深度优先搜索是否用于向当前匹配添加扩展路径 .在任何给定的层上,深度优先搜索将跟踪指向前一层中未使用节点的边。深度优先搜索树中的路径必须是交替路径(在匹配和不匹配的边之间切换)。一旦算法找到一条使用节点的增广路径 ,深度优先搜索移动到下一个起始顶点。
当在广度优先搜索步骤中找不到更多的增广路径时,算法终止。
这个问题试图将数字与字母匹配,以最大化匹配的数量。这将需要两个基本步骤,迭代直到算法找到一个完美的匹配:
- 使用BFS在L中不匹配的顶点处构建一个交替水平图。
- 使用DFS用顶点不相交的最短长度路径的最大集合来增加M。
观察有边但没有指定匹配的图。
从没有匹配的所有数值顶点开始执行BFS。选择任何不匹配的叶,并使用DFS一直返回到根。把叶和根匹配起来。
重复此过程以查找下一个匹配项。
在这个迭代,1是匹配的一个,2是匹配的b,3.,连同c没有火柴。
自3.没有匹配,执行BFS从3.为了找到一个匹配,或断言当前匹配已经是最优的。
再次执行DFS,从不匹配的叶一直执行到根。
通过切换匹配的边和不匹配的边来增加路径。
这将产生图中数字和字母之间的最大匹配。
另一种终止算法的方法发生在路径扩展步骤没有产生更多的匹配时。在这种情况下,即使不是所有顶点都匹配,也会找到最大匹配。[5]
复杂性
另请参阅
参考文献
- , .Hopcroft-Karp算法.检索于2016年6月19日https://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm
- , M。Simple-bipartite-graph.svg.检索于2016年6月18日https://en.wikipedia.org/wiki/File:Simple-bipartite-graph.svg
- Gupta, R。最大匹配Hopcroft-Karp算法.从检索http://www.geeksforgeeks.org/hopcroft-karp-algorithm-for-maximum-matching-set-2-implementation/
- , .Hopcroft-Karp算法.检索自2016年6月29日https://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm
- Chauhan D。hopcroft-karp算法.从检索https://www.youtube.com/watch?v=pJHdqbxvZOI
- , .Hopcroft-Karp算法.检索于2016年6月30日https://en.wikipedia.org/wiki/Hopcroft%E2%80%93Karp_algorithm
引用:Hopcroft-Karp算法。Brilliant.org.检索从//www.parkandroid.com/wiki/hopcroft-karp/