本人目前为止 做过最难的一题 看了别人的代码半天才看懂 真正理解代码 用了一下午的时间。代码如下:
#include<stdio.h>
#include<string.h>
int k,n,m;
int p[500][500]={0};
int luckboy[500]//一种标志 一定其luckboy[i]=1 表示i已经有后女友了 前女友不能再选他 (不能说i有女友) luckboy就一定为1
// 因为 luckboy每帮一位女士找到男朋友后 全部附为0 他的作用只是在帮i前女友找新男友时确保不再找i为男友的一个标志
int bg[500]={0};//相爱的男女 可一直到哪个女的和哪个男的相爱 下标为男孩 元素指为女孩 因为要从男孩找其前女友 故用下标表示男孩 更好找到其前女友
int foundboy(int);
int main(void)
{
int sum=0;
scanf("%d%d%d",&k,&n,&m);
for(int i=0;i<k;i++)//a和b分别表示男女生可能的配对 元素值为1表示该元素的下表a b男女生可能在一起
{
int a,b;
scanf("%d%d",&a,&b);
p[a][b]=1;
}
for(int i=1;i<=n;i++)
{
memset(luckboy,0,sizeof(luckboy));
if(foundboy(i))
sum++;
}
printf("%d",sum);
return 0;
}
int foundboy(int u)//u女孩找男友 i表示其现在的男友 当i=0时认为其无男友
{
for(int i=1;i<=m;i++)
{
if(p[u][i]&&!luckboy[i])//luckboy是一个标志(在出现判断前女友能不能找到男友的情况下 才会出现!luckboy为假) 表示i的前女友不能再找i了
{
luckboy[i]=1;// 无论哪一个u女孩第一次通过了上面的判断
//都可以先假设其和i男孩成为了男女朋友
//再看i男孩的前女友能不能找到另一个男友
if(!bg[i]||foundboy(bg[i]))//i没有女友 或i的前女友可以找到另一个男友 不能再找i(否则2人一直找i无限循环)
//通过Luckboy[i]赋值为1来保证 前女友不会在找i了
{
bg[i]=u;
return 1;
}
}
}
return 0;
}
sum记录配对的情况次数
sum++的情况 1.一女生找到一个没有前女友的男生
2.一个女生找到一个有前女友的男生 当其前女友找到了一个新男友(新男友的寻找有一个难点 即不能找原来的男友)
看别人介绍自己代码的时候 说本题算法设计到图论知识(二分图) 感觉自己要做ACM的题 还得先把数据结构看完 盲目的刷题效率是很低的 之前的递推也是如此。更加理解前人种树后人乘凉的意义,以后不再钻牛角尖,认为算法一定要自己推出来,最近学业这么重,深感效率的重要性。