zoukankan      html  css  js  c++  java
  • 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的题 还得先把数据结构看完 盲目的刷题效率是很低的 之前的递推也是如此。更加理解前人种树后人乘凉的意义,以后不再钻牛角尖,认为算法一定要自己推出来,最近学业这么重,深感效率的重要性。

  • 相关阅读:
    iOS开发-图片高斯模糊效果
    很认真地聊一聊程序员的自我修养
    iOS 动画队列—仿映客刷礼物效果
    iOS -NSOperation并发编程
    iOS Status Bar变换
    iOS 使用Quartz和OpenGL绘图
    iOS开发中WiFi相关功能总结
    视频直播初窥:高仿喵播APP
    智捷公开课马上开始了-欢迎大家一起讨论学习-第一系列读《Swift开发指南(修订版) 》看Swift视频教程
    《iOS开发指南》要改iOS8版本了,听听您的意见?
  • 原文地址:https://www.cnblogs.com/aloney/p/4531225.html
Copyright © 2011-2022 走看看