二分匹配学习(转载)

先了解一下基本的知识:

转自:http://blog.sina.com.cn/s/blog_89a06c7d0100trcg.html

二分图:

二分图又称二部图,是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i
in A, j in B), 则称图G是二分图。

匹配:

给定一个二分图,在G的一个子图G’中,如果G’的边集中的任意两条边都不依附于同一个顶点,则称G’的边集为G的一个匹配

最大匹配:

在所有的匹配中,边数最多的那个匹配就是二分图的最大匹配了

顶点覆盖:

在顶点集合中,选取一部分顶点,这些顶点能够把所有的边都覆盖了。这些点就是顶点覆盖集

最小顶点覆盖:(=最大匹配数)

在所有的顶点覆盖集中,顶点数最小的那个叫最小顶点集合。

独立集:

在所有的顶点中选取一些顶点,这些顶点两两之间没有连线,这些点就叫独立集

最大独立集: (=原点数-最大匹配数)

在左右的独立集中,顶点数最多的那个集合

路径覆盖:

在图中找一些路径,这些路径覆盖图中所有的顶点,每个顶点都只与一条路径相关联。

最小边覆盖:(=原点数-最大匹配数)

最小路径覆盖:(=原点数-新构造的图的最大匹配数)

在所有的路径覆盖中,路径个数最小的就是最小路径覆盖了。

=====================================================================================================================================================================

有一个经常被数据忽略的地方(关于最小路径覆盖):

转自:http://www.cnblogs.com/ka200812/archive/2011/07/31/2122641.html

首先,最小路径覆盖=总节点数-最大匹配数。这个应该已经是路人皆知了。

所谓最小路径覆盖,是指在一个有向图中,找出最少的几条路径,用它们来覆盖全图

这里说的值得注意的地方,如果有向图的边有相交的情况,那么就不能简单的对原图求二分匹配了

举个例子,假设有图:1->2     2->5    
2->3      4->2,事实上,这其实就是两条边:1->5 
4->3 ,节点2只是他们的一个交点

如果只是简单的在原图的基础上求二分匹配,那么得到的匹配答案是2,最小路径覆盖答案便是5-2=3。

可是随便一看都能看看出端倪,这个图中,只需要两个点便可以探索完整个地图,这里最小路径覆盖数明显是2。

问题究竟出在哪里呢?其实就和这个交点2有关。既然边有相交,那么他们的连通性也应该连通下去。

解决的办法是对原图进行一次闭包传递(也就是flody),于是便增加了四条边:1->3  
1->5   4->3  4->5

这时再求最大匹配数,匹配答案便是3,最小路径覆盖值为2,这是正确答案!

具体问题可见 PKU 2594 Treasure Exploration

最小路径覆盖和最小边覆盖:

边覆盖集:通俗地讲,所谓边覆盖集,就是G中所有的顶点都是E*中某条边的邻接顶点(边覆盖顶点),一条边只能覆盖2个顶点。

注意:在无向图中存在用尽量少的边去“覆盖”住所有的顶点,所以边覆盖集有极小与最小的区别。

极小边覆盖:若边覆盖E*中的任何真子集都不是边覆盖集,则称E*是极小边覆盖集。

最小边覆盖:边数最小的边覆盖称为最小边覆盖,通俗地讲,就是极小边覆盖中的最小的一个集合。

最小边覆盖在二分图中的应用:

最小边覆盖 = 最大独立集 = n - 最大匹配,这个是二分图上的一个性质。

最小路径覆盖与最小边覆盖的区别

最小路径覆盖和最小边覆盖不同,不要求给的图是二分图,而是要求是PXP的有向图,不能有环,然后根据原图构造二分图,构造方法是将点一分为二(拆点),v分为v*和v**然后如v*和u**有边,那么就在v*和u**之间连一条边。

然后最小路径覆盖是n-m,n为原图的点的个数,m为新造二分图的最大匹配。证明也特别简单,根据定义最小路径覆盖里要求同一个点只可以属于一条路径,即路径时不可以开叉的,如果在二分图里选两条有公共点的边那么反应在原图上就是路径有岔路,那么就不符合匹配的定义了,所以二分图里选的边必须是无公共交点的,这转化到最大匹配了。

=====================================================================================================================================================================

二分图匹配算法:

匈牙利算法: http://blog.csdn.net/akof1314/article/details/4421262

时间: 2024-10-10 16:00:06

二分匹配学习(转载)的相关文章

UPCOJ2985 Gopher(二分匹配)

这道题是我们弱校大一校赛的防AK题... 当时不到1个半小时做完其他题就一直在看他 然而当时并没有学二分匹配 然后就各种结构体sort... 整了3个多小时还是败了 于是学习了一下,这就很简单了 题意就是给你n个老鼠m个洞,并给你坐标和老鼠的速度和最晚时间 通过这些距离算出每个老鼠对于每个洞能否在规定时间内进去.. 然后就...好了 /* *********************************************** Author :devil Created Time :201

最大二分匹配hdu5093

两个集合 分别是按行和列凑成的点的集合 如图 1000 0000 2203 0004 1000 0000 1203 0003 两个集合构成的边,求该图的最大二分匹配 #include<bits/stdc++.h> using namespace std; bool edge[3000][3000]; char mapp[100][100]; int num1[100][100],num2[100][100],link[3000]; bool vis[3000]; int k1,k2,cnt;

HDU 2063.过山车【二分图、二分匹配初接触】【8月3】

过山车 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐.但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner.考虑到经费问题,boss刘决定只让找到partner的人

POJ 1469(裸二分匹配)

COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18993   Accepted: 7486 Description Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is poss

ZOJ 1516 Uncle Tom&#39;s Inherited Land(二分匹配 最大匹配 匈牙利啊)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=516 Your old uncle Tom inherited a piece of land from his great-great-uncle. Originally, the property had been in the shape of a rectangle. A long time ago, however, his great-great-uncl

hdu3468 Treasure Hunting 二分匹配

//给一个n*m的图 //.表示空白地 //*表示有黄金 //#表示墙 //一个人需要按照A...Z..a..z的顺序以最短路径走到下一个 //每次只能在他的路线上经过的地方取一块黄金 //问最多能取多少黄金 //对于每次起点和终点,用bfs搜索最短路,再用dfs找出最短路线经过的所有点 //对于第i次找最短路线与其走过的点建立边,然后用二分匹配就能找出 #include<iostream> #include<vector> #include<cstdio> #incl

HDU 2063 过山车(二分匹配入门)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063 二分匹配最大匹配数简单题,匈牙利算法.学习二分匹配传送门:http://blog.csdn.net/dark_scope/article/details/8880547 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using nam

二分匹配的常用建图方法

学习了一些常用建图方法,又理解了一遍二分,感觉更加清晰了. 1.行列匹配法:在一个矩阵中,加入上面一些点有人,现在有一些箭能将一行或一列的人杀死,问最少需要多少箭?因为箭要最少,所以要尽可能的在一行或一列上,即最小顶点覆盖问题.这时可以通过行列来进行二分匹配:假如位置(1,1),(1,3),(2,2),(3,1) 则横坐标1 2 3,纵坐标 1 2 3间有一定的关系,最小点覆盖=最大匹配数: 2.反建法:假如有一个嫉妒封建的老师,他不希望同学间发生恋情.老师发现,满足一下条件的同学发生恋情的几率

HDU 3861 The King’s Problem (强连通+二分匹配)

题目地址:HDU 3861 这题虽然是两个算法结合起来的.但是感觉挺没意思的..结合的一点也不自然,,硬生生的揉在了一块...(出题者不要喷我QAQ.) 不过这题让我发现了我的二分匹配已经好长时间没用过了..都快忘了..正好在省赛之前又复习了一下. 代码如下: #include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm>