参考啊哈算法第八章第五节
二分图:
如果一个图所有顶点能分为x,y两个集合,并且所有边的两个顶点恰好一个属于集合x一个属于集合y,即每个集合内的顶点没有边相连,那么此图就是二分图.
//二分图最大匹配
#include <stdio.h>
#include <string.h>
int e[101][101];
int book[101];
int match[101];
int n,m;
//匈牙利算法核心。
int dfs(int u)
{
for(int i=1;i<=n;i++)
if(book[i]==0&&e[u][i]==1)
{
book[i]=1; //标记i已经访问过
//如果i未被匹配或者找到了新的匹配
if(match[i]==0||dfs(match[i]))
{
//更新匹配关系
match[i]=u;
return 1;
}
}
return 0;
}
int main()
{
int sum=0;
int a,b;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
e[a][b]=1;
}
for(int i=1;i<=n;i++)
{
memset(book,0,sizeof(book));//每进行一次循环,都清空book,因为每次匹配都需要重新标记。
if(dfs(i)) //寻找寻找增广路,如果找到,匹配数+1
sum++;
}
printf("%d\n",sum);
return 0;
}
/*
3 5
1 1
1 2
2 2
2 3
3 1
*/
如果二分图有n个点,那么最多有n-2条增广路径。