浅谈匈牙利算法(二分图最大匹配)
前置知识
一张图是二分图,当且仅当它的点可以被分成两部分,而这张图上的所有边的两个端点,都分属不同的部分。我们称这两个点集,一个叫左部,一个叫右部。左部中的点叫左部点;右部中的点叫右部点。
一张图的一个匹配是一些没有公共端点的边。可以想象,对于一个二分图而言,显然一个匹配是对于每一个左部点,连一条边向一个右部点,或者不向右部点连边。但是每个左部点不会对应两个或以上的右部点。
这里现在浅谈一下匈牙利算法
常用的二分图匹配算法是匈牙利算法,其正确性基于 hall 定理,本质是不断寻找增广路来扩大匹配数。
匈牙利算法时间复杂度O(ne+m)或O(me+n),其中 n 是左部点个数,e 是图的边数,m 是右部点个数。这里用到的小trick就是对于左部点到底选用n还是m,不同的选取时间复杂度可能会大不相同
还有一个更优的网络流dinic做法,时间复杂度O(n),具体的,建立超级源点和超级汇点,源点向左侧连边,右侧向汇点连边。左右之间连边。上述边的流量都是 1 。由于 s 到点左侧任意一点 u 的流量是1,所以 u 最多被选择一次。同理右边的点也最多被选择一次。于是这个图的网络最大流即为该二分图的最大匹配。
匈牙利算法的过程是,枚举每一个左部点 u ,然后枚举该左部点连出的边,对于一个出点 v,如果它没有被先前的左部点匹配,那么直接将 u 匹配 v,否则尝试让 v 的“原配”左部点去匹配其他右部点,如果“原配”匹配到了其他点,那么将 u 匹配 v,否则 u 失配。
尝试让“原配”寻找其他匹配的过程可以递归进行。需要注意的是,在一轮递归中,每个右部点只能被访问一次。
献上模板题
【模板】二分图最大匹配 - 洛谷
AC代码:
#include <bits/stdc++.h> using namespace std; using LL = long long; int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n, m, e;cin >> n >> m >> e;vector<vector<int>> G(n + 1);for (int i = 0; i < e; i++) {int u, v;cin >> u >> v;G[u].push_back(v);}vector<int> vis(n + 1);vector<int> match(m + 1);int ans = 0;function<bool(int, int)> dfs = [&](int u, int tag) {if (vis[u] == tag) {return false;}vis[u] = tag;for (auto v : G[u]) {if (match[v] == 0 or dfs(match[v], tag)) {match[v] = u;return true;}}return false;};for (int i = 1; i <= n; i++) {if (dfs(i, i)) {ans++;}}cout << ans << '\n';return 0; }
浅谈匈牙利算法(二分图最大匹配)相关推荐
- 【模板】匈牙利算法 二分图最大匹配题模板
[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...
- POJ-3041 匈牙利算法 二分图最大匹配
踢以 给出多个点的坐标 有一种攻击 可以把一次干掉同一列的 或者干掉同一行的 求最少的攻击次数 肥西 由于问题是问选取最少的行和列干掉所有的陨石 可以把输入的r和c看成r和c之间有一条连边因为要实现干 ...
- hdu 4160 Dolls 匈牙利算法求最大匹配
Dolls Time Limit: 2000 ...
- music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法
黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...
- nyoj239 月老的难题 (匈牙利算法,最大匹配,邻接表)
题目239 题目信息 运行结果 本题排行 讨论区 月老的难题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. ...
- 浅谈PPO算法-玩转月球登陆
浅谈PPO算法-玩转月球登陆 前言 github 什么是Actor-Critic? Actor-Critic代码 ppo算法 实现 前言 总感觉强化学习公式真难学,也难表达心中所想,我还是白话强化学习 ...
- 【HDU - 2444】The Accomodation of Students(二分图判断 + 匈牙利算法求最大匹配)
题干: There are a group of students. Some of them may know each other, while others don't. For example ...
- 浅谈Manacher算法与扩展KMP之间的联系
首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一 ...
- 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)
本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...
最新文章
- Hibernate的DetachedCriteria使用(含Criteria)
- Python 多进程、多线程启动
- php中return返回数组,PHP中return返回数组的一点用法
- it devops_DevOps是IT商店的战场
- ASA8.4端口映射篇
- 三种前端手机开发(uni-app、vant、mui)
- Office Communications Server 和客户端使用的端口和协议
- Comega -- O/R Mapper的终结者?
- PDFlib使用(c++)
- Power Builder软件的下载安装
- 有什么好用的windows PDF阅读器?答案在这里面
- kodi树莓派_【树莓派】树莓派与XBMC及Kodi、LibreELEC插件(二)
- QuickChm出现的“不支持此接口”错误解决
- 【echarts】echarts根据奇偶设置柱形图颜色切换
- html数据的格式是什么格式的文件,.html是什么格式的文件,html文件怎么打开
- devexpress html编辑器,图解DevExpress RichEditControl富文本的使用,附源码及官方API
- STM32CubeMX生成工程失败
- js将中国标准时间转化为年月日时分秒(yyyy-mm-dd)格式以及时间戳,日期,天数之间的转换
- 将音频转化为文字的软件——职场必备宝典
- 圆柱容器,横放计算液体体积
热门文章
- 【程序人生】在php项目开发中,遇到进展不顺利,或毫无头绪情况下的解决办法
- 乱世女英雄--评程序员先驱霍珀
- 电商用户购买行为预测-排名48-0.23
- java向下转型是什么意思
- LInux 服务器状态查询
- TwoThink目录结构-基于ThinkPHP和OneThink
- 您的计算机配置似乎是正确的,但该设备或资源(DNS 服务器)没有检测到有响应
- springboot连接sqlserver 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接解决方法
- IDL将ENVI中打开的文件转换为其他格式
- ABP框架中一对多,多对多关系的处理以及功能界面的处理(2)