二分图匹配

来源:互联网 发布:华为机顶盒安装软件 编辑:程序博客网 时间:2024/06/13 01:28
二分图匹配
接下来的一段引自百度百科:
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条
(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
引用结束。
下面给出非正式的解释:
如果一个图,它所有的节点可以分成两部分,保证这一部分中的节点所连边的另一节点全部在另一个部分中,它就是二分图,如下:

二分图可以干什么?先想一想,或者说,什么问题可以看成一个二分图?
不管你想没想到,我们先看一个问题,n个人,应聘m项工作,每个人都能够胜任几项,但每项工作只要一个人,一人也只能承担一种工作,
问你最多有多少人可以找到工作?
很明显,这个问题可以转化为二分图求解,n个人为一个集合,m项工作为一个集合,能否胜任就是是否连边,而题目的问题,就是二分图的
最大匹配值。二分图的最大匹配,说的专业一点,就是无法继续增广(增广路的思想),说的简单一点,就是每一个连上了边的点都无法让步,连另一
个点了。至于能不能让步,就要看你打算匹配的点当前连的点能不能找到一个新的匹配,这是一个递归的过程,看看代码应该就懂了:
bool Find(int x,int f){for(int i=0;i<divide[x].size();i++){int v=divide[x][i];if(used[v]!=f){used[v]=f;if(lnk[v]==-1||Find(lnk[v],f)){lnk[v]=x;return 1;}}}return 0;}
这只是普通二分匹配,完美匹配什么的,再说吧,推荐几道题:洛谷P1129 P1640 P2055 P3386