前置知识

一张图是二分图,当且仅当它的点可以被分成两部分,而这张图上的所有边的两个端点,都分属不同的部分。我们称这两个点集,一个叫左部,一个叫右部。左部中的点叫左部点;右部中的点叫右部点。

一张图的一个匹配是一些没有公共端点的边。可以想象,对于一个二分图而言,显然一个匹配是对于每一个左部点,连一条边向一个右部点,或者不向右部点连边。但是每个左部点不会对应两个或以上的右部点。

这里现在浅谈一下匈牙利算法

常用的二分图匹配算法是匈牙利算法,其正确性基于 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;
}

浅谈匈牙利算法(二分图最大匹配)相关推荐

  1. 【模板】匈牙利算法 二分图最大匹配题模板

    [任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...

  2. POJ-3041 匈牙利算法 二分图最大匹配

    踢以 给出多个点的坐标 有一种攻击 可以把一次干掉同一列的 或者干掉同一行的 求最少的攻击次数 肥西 由于问题是问选取最少的行和列干掉所有的陨石 可以把输入的r和c看成r和c之间有一条连边因为要实现干 ...

  3. hdu 4160 Dolls 匈牙利算法求最大匹配

    Dolls                                                                               Time Limit: 2000 ...

  4. music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法

    黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...

  5. nyoj239 月老的难题 (匈牙利算法,最大匹配,邻接表)

    题目239 题目信息 运行结果 本题排行 讨论区 月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. ...

  6. 浅谈PPO算法-玩转月球登陆

    浅谈PPO算法-玩转月球登陆 前言 github 什么是Actor-Critic? Actor-Critic代码 ppo算法 实现 前言 总感觉强化学习公式真难学,也难表达心中所想,我还是白话强化学习 ...

  7. 【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 ...

  8. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一   ...

  9. 快速排序 c++_算法浅谈——分治算法与归并、快速排序(附代码和动图演示)

    本文始发于个人公众号:TechFlow 在之前的文章当中,我们通过海盗分金币问题详细讲解了递归方法. 我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及 ...

最新文章

  1. Hibernate的DetachedCriteria使用(含Criteria)
  2. Python 多进程、多线程启动
  3. php中return返回数组,PHP中return返回数组的一点用法
  4. it devops_DevOps是IT商店的战场
  5. ASA8.4端口映射篇
  6. 三种前端手机开发(uni-app、vant、mui)
  7. Office Communications Server 和客户端使用的端口和协议
  8. Comega -- O/R Mapper的终结者?
  9. PDFlib使用(c++)
  10. Power Builder软件的下载安装
  11. 有什么好用的windows PDF阅读器?答案在这里面
  12. kodi树莓派_【树莓派】树莓派与XBMC及Kodi、LibreELEC插件(二)
  13. QuickChm出现的“不支持此接口”错误解决
  14. 【echarts】echarts根据奇偶设置柱形图颜色切换
  15. html数据的格式是什么格式的文件,.html是什么格式的文件,html文件怎么打开
  16. devexpress html编辑器,图解DevExpress RichEditControl富文本的使用,附源码及官方API
  17. STM32CubeMX生成工程失败
  18. js将中国标准时间转化为年月日时分秒(yyyy-mm-dd)格式以及时间戳,日期,天数之间的转换
  19. 将音频转化为文字的软件——职场必备宝典
  20. 圆柱容器,横放计算液体体积

热门文章

  1. 【程序人生】在php项目开发中,遇到进展不顺利,或毫无头绪情况下的解决办法
  2. 乱世女英雄--评程序员先驱霍珀
  3. 电商用户购买行为预测-排名48-0.23
  4. java向下转型是什么意思
  5. LInux 服务器状态查询
  6. TwoThink目录结构-基于ThinkPHP和OneThink
  7. 您的计算机配置似乎是正确的,但该设备或资源(DNS 服务器)没有检测到有响应
  8. springboot连接sqlserver 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接解决方法
  9. IDL将ENVI中打开的文件转换为其他格式
  10. ABP框架中一对多,多对多关系的处理以及功能界面的处理(2)