二分图的匹配:给定一个二分图G,在G中的一个子图M中,M的边集{E}中的任意两条边都不依附于同一个顶点,则称M是一个匹配

二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数和即为最大匹配数。

匈牙利算法求二分图最大匹配的思想很简单,就是相当于一个一个尝试每一条边,尽可能地增加匹配数,举个例子:

以这个图为例进行讲解匈牙利算法的思想,我们先让左半部的1号节点进行匹配,按照顺序他会和右半部的1号节点进行匹配,同理左半部的2号节点会和右半部的3号节点进行匹配,左半部的3号节点会和右半部的2号节点进行匹配,轮到左半部的4号节点进行匹配时会发现右半部的2号节点已经与左半部的3号节点匹配成功,所以这个时候就要尝试让左半部的3号节点换一个匹配对象,这个时候左半部的3号节点会选择与右半部的4号节点进行匹配,这个时候右半部的2号节点就空出来了,就可以和左半部的4号节点进行匹配了,所以对应的最大匹配数就是4,这也就是一个逐步尝试的过程,其实正好对应着深搜的过程。

因为右半部是一个被匹配的过程,所以我们只需要用一个match[i]记录右半部的i号节点所匹配的左半部的节点编号即可,如果match[i]=0说明右半部的i号节点还没有进行匹配。

思路明白了,代码就比较容易实现,下面给出一道例题:

题目链接:【模板】二分图最大匹配 - 洛谷

输入样例:

4 2 7
3 1
1 2
3 2
1 1
4 2
4 1
1 1

输出样例:

2

代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cmath>
using namespace std;
const int N=1e5+10;
int h[N],ne[N],e[N],idx;
int match[N];//match[i]记录与右半部i号节点相匹配的左半部的节点编号
bool vis[N];//vis[i]标记右半部的i号节点有没有被考虑过
void add(int x,int y)
{e[idx]=y;ne[idx]=h[x];h[x]=idx++;
}
bool find(int x)
{for(int i=h[x];i!=-1;i=ne[i]){int j=e[i];if(vis[j]) continue;vis[j]=true;if(match[j]==0||find(match[j])){match[j]=x;return true;}}return false;
}
int main()
{int n1,n2,m;cin>>n1>>n2>>m;int u,v;memset(h,-1,sizeof h);for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);//因为只需要从左半部向右半部进行匹配,所以只需要加单向边 add(u,v);}int ans=0;for(int i=1;i<=n1;i++){//每个右半部的点都只会被尝试一次,所以每次都需要初始化 memset(vis,false,sizeof vis);if(find(i)) ans++;}cout<<ans;return 0;
}

最后再给大家稍微提一下最小点覆盖问题,这个问题也是可以利用匈牙利算法来解决的。

最小点覆盖问题就是我们想找到最少的一些点,使得二分图中所有的边的两个顶点至少有一个在这些点之中。

这里就不详细介绍了,直接给大家说出个结论就够用了。

一个二分图中的最大匹配数等于这个图中的最小点覆盖数。

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

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

    二分图:又叫二部图,图G中顶点集V可以分成互不相交的子集(X,Y),并且图中的每一条边所关联的点分别属于两个不同的顶点集,则图G叫二分图.(不含奇环) 二分图的匹配:给定一个二分图G的子图M,M的边集 ...

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

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

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

    问题描述: X集合(编号1~m),Y集合(编号m+1~n).n,m<100. 给出若干组合(x, y)(相当于映射x->y),问最都能同时有几个组合(分配). 分析: 题目可能简化描述得不 ...

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

    二分图最大匹配 (一).二分图的介绍 1.定义 2.充要条件 (二).二分图的匹配 1.二分图的最大匹配 2.增广路径 3.匈牙利算法 (1).复杂度 (2).算法思路 (3).代码实现 (一).二分 ...

  5. 二分图最大匹配(匈牙利算法Dinic算法)

    二分图最大匹配: 给出一个二分图,左边有若干个节点,右边有若干个节点,左边的节点想到匹配右边的节点,每个左边的节点每个都有若干个可以选择的对象,每个左边节点只能选择一个右边节点,每个右边节点也只能被选 ...

  6. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 1 /* 2 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 3 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 4 */ 5 ...

  7. NYOJ 题目239 月老的难题 (二分图最大匹配-匈牙利算法模板)

    月老的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一 ...

  8. NYOJ - 239 - 月老的难题 ( 二分图最大匹配 匈牙利算法 )

    描述 月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘. 现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭. 现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸 ...

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

    Algorithm.( Augmenting Path Algorithm ) Input:     An X-Y bigraph G, a matching M in G,     and the ...

  10. [HDOJ2819]Swap(二分图最大匹配, 匈牙利算法)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2819 题意:给一张n*n的01矩阵,可以任意交换其中的行或者列,问是否可以交换出来一个对角 ...

最新文章

  1. 为什么程序员总是发现不了自己的Bug?
  2. iOS无法引入头文件
  3. mysql not in优化_MySQL性能优化 — 实践篇2
  4. 对一道面试题的总结与扩展思考(关于一笔画问题的数学分析)
  5. earcharts tree 节点间隔_InnoDB是顺序查找B-Tree叶子节点的吗?
  6. vb鼠标涂鸦板的制作
  7. rest-framework之响应器(渲染器)
  8. elementui展示多张图片_fabric.js之旅图片
  9. (原創) 开启Notebook时,建议从天版中间开启 (日記)
  10. 7.4 集合及其内置方法
  11. 【图像边缘检测】基于matlab GUI Sobel+Prewitt+Canny算子图像边缘检测(带面板)【含Matlab源码 1045期】
  12. Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(二)?
  13. 4款Bootstrap在线富文本编辑器
  14. 模拟人生4极乐净土mod_如何在《模拟人生4》中下载Mod
  15. XShell v7里的快捷键
  16. ITellYou结合软碟通安装Win10系统指南
  17. 用Angular实现图片上传问题
  18. delphi去掉字段前后的引号_delphi 单引号在字符串中使用方法
  19. Jetson 配置中文环境,中文输入法,安装QQ
  20. 46. 全排列:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

热门文章

  1. html调用其他网页内容
  2. subsonic 3.0 mysql_SubSonic3.0使用外连接查询时查询不出数据的问题修改-阿里云开发者社区...
  3. 行业深度报告--短期业绩压力加速价值壁垒
  4. Flink内核源码(八)Flink Checkpoint
  5. 苑姓起源——古老而孤独
  6. 向上转型和向下转型的区别
  7. Python统计文件字母出现次数(字典形式返回结果)
  8. 笔记本电脑性价比排行2022年最值得入手 笔记本电脑性价比排行学生用
  9. 深度学习剖根问底: 卷积层的权值和梯度的更新
  10. 美国主机高级安全配置有哪些