原题
思路
就是一道单纯的二分图匹配,用一个二维数组记录联系即可
易错点:这题的数据先给的女生,后给的男生数据。定义n和m的话不要用混,统计最大匹配对数用的是女生人数,函数found遍历的男生人数
#include<stdio.h>
#include<string.h>
#define mem(x) memset(x,0,sizeof(x))
#define N 510
int b[N],book[N];
int dis[N][N];
int t,n,m;
bool search(int x)
{
for(int i=1;i<=n;i++) //还有的题型是每个人对应一个区间
{
if(dis[x][i]&&!book[i]) //这里的book[i],在递归的时候判段一个人原配是否已被占据
{
book[i]=1; //标记i已被占据
if(b[i]==0||search(b[i])) //单身,或者其影响到的所有人都可以换掉原配而不影响
{
b[i]=x;
return true;
}
}
}
return false;
}
int main()
{
while(~scanf("%d",&t)&&t){
scanf("%d%d",&m,&n);
int x,y;
mem(dis),mem(b);
for(int i=0;i<t;i++){
scanf("%d%d",&x,&y);
dis[x][y]=1;
}
int ans=0;
for(int i=1;i<=m;i++){
mem(book); //因为每次都要尝试是否能占据别人原配,增加整体配对数
if(search(i))ans++;
//这有2种情况,1是i可以配对(找到单身人士,或者占据已配对的人
//且已配对的人都可以找到新配偶而达到增加整体配对数
//2是不行,别人无论怎么调换也腾不出来配偶给i
}
printf("%d\n",ans);
}
return 0;
}