Hopcroft-Karp 算法用于最大匹配2025 年 2 月 6 日 | 阅读 5 分钟 引言在二分图中,我们可以说匹配是边的集合,其选择方式是任何一个端点不共享多于一条边。我们也可以说最大边数的匹配称为最大匹配。如果我们在最大匹配中添加任何其他边,则它不再是匹配。在二分图中,可能存在多个最大匹配。 让我们讨论一些与该算法相关的术语 1. 自由节点或顶点 在匹配 M 中,存在一个不属于匹配的节点。我们可以将此节点称为自由节点。在下面的图中,u2 和 v2 是自由节点。在第三个图中,没有顶点是自由的。 2. 匹配边和非匹配边 在匹配 M 中,属于匹配的边,我们称之为匹配边。不属于匹配的边可以称为非匹配边。在下面的图中,第一个图包含所有非匹配边;在第二个图中,(u0, v1)、(u1, v0) 和 (u3, v3) 是匹配边,其他是非匹配边。 3. 交替路径 在给定的匹配 M 中,当一条路径连接了匹配边和非匹配边时,我们可以称之为交替路径。我们也可以说所有单边路径都是交替路径。在下面的图中,u0-v1-u2 和 u2-v1-u0-v2 被称为交替路径。 4. 增广路径 在给定的匹配 M 中,当一条交替路径从自由节点开始并结束于自由节点时,我们可以称之为增广路径。我们也可以说所有从自由顶点开始和结束的单边路径都是增广路径。 我们必须注意一点:增广路径总是多一条匹配边。在 Hopcroft-Karp 算法中,如果存在增广路径,则匹配 M 不是最大匹配。 Hopcroft-Karp 算法该算法基于以下步骤。它们是:
在下面的图中,我们已经实现了上述内容。 ![]() Hopcroft-Karp 算法的实现在实现此算法之前,我们必须注意以下几点。它们是:
广度优先搜索背后的主要思想是找到增广路径。由于 BFS 只能逐层遍历,因此它可以将图分成匹配边和非匹配边的层。然后,我们必须添加一个虚拟顶点 NIL,它用于连接左侧的所有顶点和右侧的所有顶点。借助下面的一些数组,我们可以找到增广路径。我们必须将到 NIL 的距离初始化为无限。如果我们从一个虚拟顶点开始,并使用不同顶点的交替路径返回到它,那么肯定存在增广路径。 所需的数组如下
此数组的大小为 m+1。这里,m 是二分图左侧顶点的数量。借助此数组,我们可以存储 u 在右侧的对(如果 u 已匹配),如果未匹配,则为 NIL。
此数组的大小为 n+1。这里,n 表示二分图右侧顶点的数量。借助此数组,我们可以存储 v 在左侧的对(如果 v 已匹配),否则为 NIL。
此数组的大小为 m+1。这里,m 表示二分图左侧顶点的数量。如果 u 不匹配且 INF(无限),那么我们必须将 dist[] 初始化为 0。此外,我们必须将 NIL 的 dist[] 初始化为 INF。 找到增广路径后,我们必须借助 DFS(深度优先搜索)将增广路径添加到当前匹配中。 让我们借助以下程序来理解该算法的实现。 C++ 14 中的实现代码 输出 ![]() 说明 在上面的代码中,我们使用 C++ 实现了 Hopcroft-Karp 算法来查找最大匹配。 时间复杂度 这里,该算法的时间复杂度为 O(V x E),其中 E 是边的数量,V 是顶点的数量。 空间复杂度 这里,该算法的空间复杂度为 O(V)。 下一主题BST 中给定键的中序前驱和后继 |
在数学和计算机编程中,恰好两个字符串的组合被称为字符串对。对中的每个字符串都可以是字母、单词或其他字符的任意组合。为了表达或比较两个相关的文本段落,操作两个...
7 分钟阅读
问题陈述:给定字符串 croakOfFrogs,它代表不同青蛙的“croak”字符串组合,即可以同时有多只青蛙呱呱叫,因此混合了多个“croak”。返回完成所有呱呱叫所需的最小青蛙数量...
11 分钟阅读
为了更好地理解数据结构中栈的局限性,我们需要了解栈及其用途以及它不能在哪里使用。栈和表示用作存储数据的简单线性数据结构称为栈。后进先出 (LIFO) 原则,...
阅读 6 分钟
问题陈述:将二叉搜索树转换为具有相同元素的最小堆,采用原地方法并在线性时间复杂度 (O(n)) 内完成此转换。输入:15 / ...
阅读 12 分钟
了解事件队列(event queue)是异步编程中使用的数据结构。它是一个回调函数队列,按特定顺序安排执行。这些回调通常与事件、用户交互或来自外部资源的响应相关联。异步编程允许...
阅读 3 分钟
二叉树的最大宽度可以定义为二叉树中存在于特定层上的节点的最大数量。要计算二叉树的最大宽度,我们需要遍历...
阅读 22 分钟
理解栈栈使用 LIFO(后进先出)原则存储数据。最后添加的项是第一个被移除的,就像一叠盘子一样。栈实现栈是计算机中的一种内存结构,当添加或删除元素时,它会更新其指针(SP)。...
阅读 3 分钟
本文探讨了删除超出指定范围的 BST 键的问题,并提供了一个 C 语言的实现。熟练掌握根据特定标准(如范围限制)操作 BST 对于各种应用至关重要,包括算法创建和...
阅读 4 分钟
简介从给定节点开始燃烧二叉树是计算机科学中一个迷人的问题,经常在算法面试和编程竞赛中遇到。这项任务包括从给定的节点开始,在整个二叉树中模拟火势蔓延,并确定它...
阅读 4 分钟
引言 在模式生成和算法设计领域,矩阵内交替块的概念提出了一个有趣的问题。创建具有交替的“O”和“X”矩形的矩阵需要基本的编程能力、推理能力和模式识别能力。在本文中,我们将探讨...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India