很惭愧一道11页的水题卡了我半天。。。
二分图最大匹配的裸题
http://blog.csdn.net/dark_scope/article/details/8880547
http://blog.csdn.net/lw277232240/article/details/72615522
两位神犇的博客详解了匈牙利算法
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
int pr[510];
int n,m,k;
bool vis[510],map[510][510];
bool find(int x)
{
for(int i=1;i<=m;i++)
{
if(map[i][x]&&!vis[i])//如果没找过这个女生且可以找
{
vis[i]=1;//就试试
if(pr[i]==-1||find(pr[i]))//如果这个女生之前没有伴儿或者能腾出空来
{
pr[i]=x;//就先和这个男生配对
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d",&k)!=EOF)
{
if(k==0) break;
int sum=0;
memset(map,0,sizeof(map));
memset(pr,-1,sizeof(pr));
scanf("%d%d",&m,&n);
for(int i=1;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=1;
}
for(int i=1;i<=n;i++)
{
memset(vis,0,sizeof(vis));//对每一个新的男生重置他找过的女生
if(find(i)) sum++;
}
printf("%d\n",sum);
}
return 0;
}