二分匹配我认为其实就是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算法: