关于二分图问题的一些知识

二分图相关问题:

1、 二分图最大匹配   (定义:匹配是二分图中边的集合,且集合中的任意两条边没有公共点,包含边数最多的匹配就是最大匹配)
2、 二分图最小覆盖   (寻找一个点集,是的图中每一个边至少有一个点在该边上,即用最少的顶点去覆盖所有的边)
3、 二分图最大独立集 (寻找一个点集,其中任意两点在图中无对应边)
4、 二分图最小路径覆盖  (用尽量少的不相交简单路径覆盖有向无环图的所有顶点
5、 二分图最优匹配
6、 稳定婚姻问题

二分图定义及判定:

定义:二分图中,顶点可以分为两个集合 X Y ,每一条边的两个顶点都分别位于 X Y 集合中

判定:利用 BFS 或者 DFS 进行黑白染色,共享一边的两点异色,检查是否存在矛盾

图G为二分图的充要条件是图中不含奇环

二分图的最大匹配可以用匈牙利算法解决:

int G[maxn][maxn];
int mark[maxn];
bool visit[maxn];
int n,m;
int path(int u)
{
	int i;
	for(i=1;i<=m;i++)
	{
		if(G[u][i] && !visit[i])
		{
			visit[i]=true;
			if(mark[i]==-1 || path(mark[i]))
			{
				mark[i]=u;
				return 1;	
			}	
		}	
	}	
	return 0;
}
int Max_Match()
{
	int i,ans;
	memset(mark,-1,sizeof(mark));
	ans=0;
	for(i=1;i<=n;i++)
	{
		memset(visit,false,sizeof(visit));
		if(path(i))
			ans++;	
	}	
	return ans;
}


 1、二 分图的最小覆盖 = 二分图的最大匹配
 2、二分图的最大独立集=顶点数-最大匹配
 3、二分图的最小路径覆盖解法:每个顶点分为两个,分别在X集合和Y集合中,如果存在有向边(a,b),对应在二分图中有(Xa,Yb),最小路径数=节点数-最大匹配


                                            

你可能感兴趣的:(算法,Path)