acm2063 很难的一题

      本人目前为止 做过最难的一题 看了别人的代码半天才看懂 真正理解代码 用了一下午的时间。代码如下:

 

#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男孩成为了男女朋友 设置标准 luckboy[i]=1;
//再看是否真的可以成为男女朋友 即下面的判断
}
if(!bg[i]||foundboy(bg[i]))//1.i没有女友 2.i已经有女友了,但i的前女友可以找到另一个新男友 不能再找i(否则2人一直找i无限循环)
//通过Luckboy[i]赋值为1来保证 前女友不会在找i了
{
bg[i]=u;//这里是真正建立男女关系 而非luckboy所代表的假设成为男女朋友
return 1;
}
}
return 0;
}

 

sum记录配对的情况次数

sum++的情况  1.一女生找到一个没有前女友的男生

                     2.一个女生找到一个有前女友的男生 当其前女友找到了一个新男友(新男友的寻找有一个难点 即不能找原来的男友)

 

 

      看别人介绍自己代码的时候 说本题算法设计到图论知识(二分图) 感觉自己要做ACM的题 还得先把数据结构看完 盲目的刷题效率是很低的 之前的递推也是如此。更加理解前人种树后人乘凉的意义,以后不再钻牛角尖,认为算法一定要自己推出来,最近学业这么重,深感效率的重要性。

 

转载于:https://www.cnblogs.com/aloney/p/4531225.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值