二分图的性质
①最大独立集=点数-最大匹配数
②最小路径覆盖(有向无环图)=点数-最大匹配数
③最小点覆盖数=最大匹配数
#include<stdio.h>
#define N 510
int map[N][N];
int use[N],link[N],n,m;
bool dfs(int x){
int i,j;
for(i=1;i<=m;i++){
if (use[i]==0 && map[x][i]) {
use[i]=1;
j=link[i];
link[i]=x;
if (j==-1|| dfs(j))
{
return true;
}
link[i]=j;
}
}
return false;
}
int hungary()
{
int num=0;
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
use[j]=0;
if (dfs(i))
num++;
}
return num;
}
int main()
{
int i,j,k,x,y;
while(scanf("%d%d",&n,&k)!=EOF)
{
m=n;
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
map[i][j]=0;
link[i]=-1;
}
while(k--)
{
scanf("%d%d",&x,&y);
map[y][x]=1;
}
printf("%d\n",hungary());
}
return 0;
}
本文介绍了一种基于匈牙利算法实现的最大匹配问题解决方案,并通过具体代码示例详细展示了如何求解二分图的最大匹配数。此外,还探讨了二分图的一些基本性质,如最大独立集、最小路径覆盖及最小点覆盖数等。
1070

被折叠的 条评论
为什么被折叠?



