二分匹配 (匈牙利算法及模板)

   二分匹配我认为其实就是m个女生,n个男生相互认识的在一起,求最大匹配成的对数。

   二分匹配的时间复杂度是O(NM)

相关概念:

最大匹配数:最大匹配的匹配边的数目

  • 定理1:最大匹配数 = 最小点覆盖数(这是 Konig 定理)
  • 定理2:最大独立集 = 顶点数 - 最小点覆盖数
  • 定理3:最小路径覆盖数 = 顶点数 - 最大匹配数

最大完全数:图中最大完全子图的顶点个数。

独立集:图中任意两个顶点都不相连的顶点集合。

独立数:独立集中顶点的个数  

完全子图:任意两点都相连的顶点的集合 

最大完全数(最大团)=原图的补图的最大独立数 

模板:

#include<stdio.h>
#include<string.h>
int map[110][110],book[110],match[110];
int n,m;
int dfs(int u)
{
	int i;
	for(i=1;i<=n;i++)
	{
		if(book[i]==0&&map[u][i]==1)
		{
			book[i]=1;
			if(match[i]==0||dfs(match[i]))
			{
				match[i]=u;
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	int i,sum,a,b;
	sum=0;
	memset(map,0,sizeof(map));
	memset(match,0,sizeof(match));
	scanf("%d%d",&n,&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&a,&b);
		map[a][b]=1;
	}	
	for(i=1;i<=n;i++)
	{
		memset(book,0,sizeof(book));
		if(dfs(i))
			sum++;
	}
	printf("%d\n",sum);
	return 0;
} 

KM算法:

            KM算法详解+模板

猜你喜欢

转载自blog.csdn.net/wan_ide/article/details/81537350