题目
对于本题有一个初步想法是设立一个n行m列的二维数组a[m][n]
,将各组数据代入来代表i
女生是否想和j
男生一起过山车,如果想则有a[i][j]=1
,否则a[i][j]=0
。更便于运算。
然后再写一个判断某男生x是否有伙伴的函数,大抵如下:
int qwe(int x)
{
int i;
for(i=1;i<=m;i++)
{
if(book[i]==0&&e[x][i]==1)
{
book[i]=1;
if(f[i]==0||qwe(f[i]))
{
f[i]=x;
return 1;
}
}
}
return 0;
}
即要求与该男生配对的女生没有被配对过,而且该女生想和该男生配对
如果该女生被配对后与其相关的数组元素变为1,表示该女生已经被配对过了。
如果这个女生被配对过了且配对的男生不是该男生,那么用递归的思路去判断这个女生之前配对的那个男生是否有其他配对,如果有,让之前的那个男生去配对其他女生,该男生配对这个女生。
大致思路如上,接下来就是咱们的代码
#include<stdio.h>
#include<string.h>
int e[1100][1100],book[1100],f[1100];
int a,b,c,d,t,n,m,sum;
int qwe(int x);
int main()
{
scanf("%d %d %d",&t,&n,&m);
int i,j;
sum=0;
while(1)
{
scanf("%d",&a);
if(a==0) break;
scanf("%d",&b);
e[a][b]=1;
}
for(i=1;i<=n;i++)
{
memset(book,0,sizeof(book));
if(qwe(i))
sum++;
}
printf("%d\n",s);
return 0;
}
int qwe(int x)
{
int i;
for(i=1;i<=m;i++)
{
if(book[i]==0&&e[x][i]==1)
{
book[i]=1;
if(f[i]==0||qwe(f[i]))
{
f[i]=x;
return 1;
}
}
}
return 0;
}
最后结果如下: