二分图匹配

二分图概念

二分图:

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

简单的说,一个图被分成了两部分,相同的部分没有边,那这个图就是二分图,二分图是特殊的图。

最大二分图匹配

最常用的是匈牙利算法,实际上是一种贪心的策略,尽量使每一个点存在匹配。

模板题

代码


const int maxn=1005;
int n,m,t;
int mch[maxn],vis[maxn];
vector<int >g[maxn];
bool dfs(int u,int tag)
{
	if(vis[u]==tag)return false;//应该是避免绕圈 
	vis[u]=tag;
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(mch[v]==0||dfs(mch[v],tag))//如果这个点未被匹配或者原先匹配的点可以找到别的匹配点 
		{
			mch[v]=u;
			return true;
		}
	}
	return false;
}
main(void)
{
	n=read();
	m=read();
	t=read();
	while(t--)
	{
		int u=read();
		int v=read();
		g[u].push_back(v);
	} 
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		if(dfs(i,i))
		{
			ans++;
		}
	}
	cout<<ans;
}

二分图最优匹配与km算法

详解

例题

最小顶点覆盖

定义:假如选了一个点就相当于覆盖了以它为端点的所有边。最小顶点覆盖就是选择最少的点来覆盖所有的边。

定理:最小顶点覆盖等于二分图的最大匹配。

最大独立子集

定义:选出一些顶点使得这些顶点两两不相邻,则这些点构成的集合称为独立集。找出一个包含顶点数最多的独立集称为最大独立集。

定理:最大独立集 = 所有顶点数 - 最小顶点覆盖 = 所有顶点数 - 最大匹配

原文地址:https://www.cnblogs.com/wangqianyv/p/13365137.html