这道题我之前就提交过很多遍,但是其实一直没有完全弄明白这道题该怎么做。
对于女孩儿x,首先寻找可以和她组合的男伴y,如果y没有女伴,那么他们俩直接组合;如果y有女伴z,那么就去寻找z有没有其他适合的男伴,如果有,就将y让给x,否则x继续遍历去寻找下一个符合条件的男伴。
思路就是这么简单,但是之前我学的时候却一直弄不明白,我是要有多菜啊我!
#include<stdio.h>
#include<string.h>
#define N 505
int map[N][N],link[N],mark[N];
int k,girl,boy;
int dfs(int x)
{
int i;
for(i=1;i<=boy;i++)
{
if(map[x][i]==1&&mark[i]==-1)
{
mark[i]=1;
if(link[i]==-1||dfs(link[i]))
{
link[i]=x;
return 1;
}
}
}
return 0;
}
int main()
{
while(scanf("%d",&k),k)
{
scanf("%d%d",&girl,&boy);
memset(map,0,sizeof(map));
int i;
for(i=1;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
map[x][y]=1;
}
memset(link,-1,sizeof(link));
int ans=0;
for(i=1;i<=girl;i++)
{
memset(mark,-1,sizeof(mark));
if(dfs(i))
ans++;
}
printf("%d\n",ans);
}
return 0;
}