二分图最大匹配及匈牙利、HK算法

article/2025/9/17 8:55:45

二分图最大匹配

在二分图中,最大匹配是指选出尽可能多的边使得任意两边没有公共端点。

增广路

M M M为二分图 G G G已匹配的边的集合,若 P P P是图 G G G中一条连接两个未匹配顶点的路径(起点终点分别在两个集合),属于 M M M的边和不属于 M M M的边交替出现,则 P P P称为 M M M的一条增广路(直接匹配的边也是特殊的增广路)。

如下图所示,当 1 1 1 A A A已经匹配,而尝试寻找 2 2 2的匹配时,发现它只能匹配 A A A
在这里插入图片描述

然后尝试让 2 2 2匹配 A A A,这时再给 1 1 1找新的匹配的过程看做:从 2 2 2出发,遍历到 A A A;再从 A A A遍历到 1 1 1;最后遍历 A A A的未匹配的终点,即从 1 1 1 B B B。那么如下图所示的起点终点确定,确定匹配的边和不能匹配的边交替出现的交错路,就称为增广路
在这里插入图片描述

匈牙利算法

匈牙利算法是依据贪心思想的二分图最大匹配算法。

简单易懂的理解:对于给定的二分图,我们只需考虑左边或者右边的一个点集,然后枚举所有的点。对于当前枚举的点 u u u,考虑它所连向的点 v v v是否已经匹配:若没有匹配,则直接匹配;若已经匹配了 u ′ u' u,我们采用的策略是暂时将 u u u v v v相连接,重新给 u ′ u' u找匹配对象。即递归遍历 u ′ u' u所有连向的点,如果能再次匹配到未匹配的 v ′ v' v,则回溯修改沿途的所有的匹配,建立新的匹配关系。这时新的匹配数显然增加了 1 1 1,最终增加的所有匹配数即为答案。

增广路径下的理解:不难发现,如果需要得到最大匹配,就是给每个节点寻找增广路的过程。如果能找到增广路,那么答案增加,最终增加的次数即为答案。

时间复杂度 O ( n ∗ e ) O(n*e) O(ne) n n n为一边的点数, e e e为边数。

dfs模板

  • m a t c h [ i ] match[i] match[i]:对于右点集编号为 i i i的点,匹配的左点集的编号。
  • v i s [ i ] vis[i] vis[i]:右点集编号为 i i i的点在这次搜索中是否判断。
  • g [ i ] g[i] g[i]:左点集编号为 j j j的点所连向的所有右点集的点。
int match[maxn];
bitset<maxn> vis;
vector<int> g[505];
int n;     //左边的点数bool dfs(int u) {for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (!vis[v]) {vis[v] = 1;if (match[v] == -1 || dfs(match[v])) {match[v] = u;return 1;}}}return 0;
}int hungary() {int ans = 0;memset(match, -1, sizeof match);for (int i = 1; i <= n; i++) {vis.reset();if (dfs(i)) ans++;}return ans;
}

Hopcroft-Karp算法

H K HK HK算法相对于匈牙利算法来说,每次都是增广一系列路径,因此更快。我们每次从所有未匹配的左部节点开始 B F S BFS BFS,进行距离标号。对于每个队列中的节点 X X X,考虑和它相邻的所有右部节点 Y Y Y,若 Y Y Y是一个未匹配的右部节点,则说明至少存在一条增广路,使用一个 b o o l bool bool变量 o k ok ok记录,以便之后增广;否则,将 Y Y Y的匹配节点加入到队列中顺便求出距离标号。当 B F S BFS BFS结束时,若不存在增广路,即 o k ok ok f a l s e false false,那么算法结束;否则对于每一个未匹配的左部节点 X X X执行匈牙利算法,注意在这里匈牙利算法中只需考虑满足 d x [ u ] + 1 = d y [ v ] dx[u]+1=dy[v] dx[u]+1=dy[v]的边 ( u , v ) (u,v) (u,v)
在这里插入图片描述
时间复杂度 O ( e n ) O(e\sqrt{n}) O(en )

模板

const int maxn = 5e4 + 10;int n1, n2;  //左右部的节点数
int mx[maxn], my[maxn], dx[maxn], dy[maxn];  //左右部匹配的节点以及左右部顶点的距离
queue<int> q;
bitset<maxn> vis;
vector<int> g[maxn];bool find(int u) {for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (!vis[v] && dy[v] == dx[u] + 1) {vis[v] = 1;if (!my[v] || find(my[v])) {mx[u] = v, my[v] = u;return true;}}}return false;
}int matching() {memset(mx, 0, sizeof mx);memset(my, 0, sizeof my);int ans = 0;while (1) {bool ok = 0;while (!q.empty()) q.pop();memset(dx, 0, sizeof dx);memset(dy, 0, sizeof dy); for (int i = 1; i <= n1; i++) {if (!mx[i]) q.push(i);}while (!q.empty()) {int u = q.front();q.pop();for (int i = 0; i < g[u].size(); i++) {int v = g[u][i];if (!dy[v]) {dy[v] = dx[u] + 1;if (my[v]) {dx[my[v]] = dy[v] + 1;q.push(my[v]);} else ok = 1;}}}if (!ok) break;vis.reset();for (int i = 1; i <= n1; i++)if (!mx[i] && find(i)) ans++;}return ans;
}

http://chatgpt.dhexx.cn/article/tMgrk261.shtml

相关文章

用最大流解决二分图最大匹配 Bipartite Matching

有A B C三个老师&#xff0c;D E F三门课&#xff0c;A能教E, B能教D和F&#xff0c;C能教D和E。要求每个老师只能教一门课&#xff0c;求分配方案。 这是一个典型的二分图最大匹配问题&#xff0c;二分图是只graph的顶点可以分为两部分&#xff0c;每部分内部顶点直接无连接&…

二分图最大匹配-匈牙利算法

今天介绍 匈牙利算法 &#xff1a; 匈牙利算法&#xff0c;是基于Hall定理中充分性证明的思想&#xff0c;它是部图匹配最常见的算法&#xff0c;该算法的核心就是寻找增广路径&#xff0c;由匈牙利数学家Edmonds于1965年提出&#xff0c;因而得名。 先介绍一下增广路径&#x…

求解分配问题(二) 二分图最大匹配算法

我的前一篇文章介绍了对于分配问题的Kuhn-Munkre算法&#xff0c;该算法其实可以看作是邻接矩阵形式的匈牙利算法&#xff0c;如果更抽象地看这个算法&#xff0c;它可以看成是一个二分图匹配算法的变体算法&#xff0c;具体的说&#xff0c;是二分图最大权重匹配算法。我打算也…

二分图最大匹配(匈牙利算法,Dinic网络流算法)

二分图最大匹配 二分图最大匹配问题: 有两个集合A,B,两个集合间有多条边连接集合中的点,且单个集合中的点各不相连,求两集合的点能两两配对的最大匹配数. (参考:)二分图最大匹配——匈牙利算法 匈牙利算法: A集合记录各点与B集合相连的点,B集合记录某点与A集合中匹配的点.遍历…

二分图最大匹配与最大独立集

一.概念部分 1.什么是二分图&#xff1f; 通俗的说法&#xff1a;就是可以把图分成两部分&#xff0c;每一部分任意两点之间没有关系&#xff08;同一部落&#xff09;&#xff0c;两部分之间点可能存在多种关系。 2.怎么判断二分图&#xff1f; &#xff08;1&#xff09;…

二分图最大匹配及最大权匹配

二分图最大匹配学习 一.二分图的基本知识二.二分图最大匹配什么是二分图最大匹配怎么求二分图最大匹配 三.二分图最大权匹配四.例题训练三.最小点覆盖数 一位大佬的神级解释 本以为有了网络流&#xff0c;就不用再学匈牙利了&#xff0c;但在做题的过程中&#xff0c;发现有些…

二分图最大匹配问题(匈牙利算法)

什么是二分图 如果一个无向图的的顶点可以分为两个互不相交的子集A和B&#xff0c;那么它就是二分图。也就是说&#xff0c;A、B内部不存在连边&#xff0c;所有连边都一头连着A中的顶点&#xff0c;另一头连着B中的顶点。 什么是二分图最大匹配&#xff1f; 二分图最大匹配…

二分图 二分图最大匹配

首先来说一下什么是二分图。 二分图 二分图又称作二部图&#xff0c;是图论中的一种特殊模型。 设G(V, E)是一个无向图。如果顶点集V可分割为两个互不相交的子集X和Y&#xff0c;并且图中每条边连接的两个顶点一个在X中&#xff0c;另一个在Y中&#xff0c;则称图G为二分图。…

二分图最大匹配(最大流)

先举个例子&#xff0c;有N台计算机和K个任务&#xff0c;每个计算机只能执行一个任务&#xff0c;但可以执行多种任务。现在给出N和K&#xff0c;和其关系&#xff0c;求出最多能处理的任务数。 这就是典型的二分图&#xff0c;整张图被分为两半&#xff0c;一半是电脑&#…

图论总结(一)二分图最大匹配

二分图最大匹配 (一)、二分图 1、定义2、性质3、判定(二)、二分图的匹配 1、二分图的最大匹配2、 Knig定理及其证明3、最小边覆盖与最大独立集(三)、增广路径 1、定义2、性质3、寻找增广路(四)、匈牙利算法 1、找增广路经的算法2、实践3、算法分析(五)、例题 1、最小…

二分图的最大匹配

一、概念&#xff1a; 二分图&#xff1a;简单来说&#xff0c;如果图中点可以被分为两组&#xff0c;并且使得所有边都跨越组的边界&#xff0c;则这就是一个二分图。准确地说&#xff1a;把一个图的顶点划分为两个不相交集 U 和V &#xff0c;使得每一条边都分别连接U、V中的…

二分图最大匹配问题

最近在做的打车项目中&#xff0c;涉及到了用户叫单后&#xff0c;将所有出单司机和所有订单匹配的问题&#xff0c;借此来学习一下二分图的匹配算法。 一、无权二分图最大匹配 首先要区分一下各个概念&#xff1a; 匹配&#xff1a;图G的一个匹配是由一组没有公共端点的不是…

二分图最大匹配——匈牙利算法

二分图最大匹配 &#xff08;一&#xff09;、二分图的介绍1、定义2、充要条件 &#xff08;二&#xff09;、二分图的匹配1、二分图的最大匹配2、增广路径3、匈牙利算法&#xff08;1&#xff09;、复杂度&#xff08;2&#xff09;、算法思路&#xff08;3&#xff09;、代码…

B树最小高度和最大高度的推导

B树最小高度和最大高度的推导 对任意一棵包含n个关键字&#xff0c;高度为h&#xff0c;阶数为m的B树&#xff0c;其最小高度和最大高度的推导过程如下&#xff1a;

算法篇:树之树的高度

算法&#xff1a; 这一类题目很简单&#xff0c;不过却是树的最基本操作之一&#xff0c;引申为判断树是不是平衡二叉树。 一般做法是&#xff0c;计算二叉树的左右子树的高度1&#xff0c;然后取它们的最大值或者最小值。 题目1: https://leetcode-cn.com/problems/balanced-b…

【二叉树】最小高度树

0x00 题目 给定一个 有序 整数数组 元素各不相同且按 升序 排列 编写一个算法&#xff0c;创建一棵 高度最小 的二叉 搜索 树 给定有序数组: [-10,-3,0,5,9] 一个可能的答案是&#xff1a;[0,-3,9,-10,null,5] 它可以表示下面这个高度平衡二叉搜索树&#xff1a; 0 / \ -3 …

常见数据结构详细图解、树的高度、深度、层数、跳表、二叉搜索树、平衡二叉树、红黑树、B树、B+树

常见数据结构 常用的数据结构知识。 1.1 跳表 上图是一个有序链表&#xff0c;我们要检索一个数据就挨个遍历。如果想要再提升查询效率&#xff0c;可以变种为以下结构&#xff1a; 现在&#xff0c;我们要查询11&#xff0c;可以跳着来查询&#xff0c;从而加快查询速度。 …

树的高度 递归法和非递归法

递归法思路&#xff1a; 树的高度即节点子树的高度1&#xff08;节点子树的高度即左子树高度&#xff0c;右子树高度的最大值&#xff09; 代码如下&#xff1a; // Height_Recursive 递归法求树的高度 int Height_Recursive(TreeNode* pTree) {if (pTree NULL) {return 0;…

获取树高度的两种方法与完全二叉树的判断

树的高度 树的高度是节点高度的最大值。 每一层节点的高度如图所示。 方法一&#xff1a;递归 根节点的高度显然就是二叉树的高度。 /** * 获取树的高度* return*/ public int height(){return height2(root); }/*** 使用递归方法获取树的高度* param node* return*/ priv…

红黑树

一.简介 红黑树作为一种二叉搜索树的一种实现&#xff0c;红黑树的左右子树高度差可能大于 1。所以红黑树不是严格意义上的平衡二叉树&#xff08;AVL&#xff09;&#xff0c;但红黑树是黑色节点完美平衡&#xff0c; 其平均统计性能要强于 AVL 。 红黑树是每个节点都带有颜…