Problem 05 最大匹配

  • 题目描述:

一群男女去玩过山车,每个女孩都有自己的想法,女孩只能和与自己想要的男孩一起坐过山车,如果没有找到自己的同伴,就无法坐过山车。问最多有多少组可以坐过山车。

  • 思路:

先对第一个女孩寻找同伴,让女孩与其想组合的同伴组成一组,再对第二个女孩寻找同伴,如果第二个女孩的首选已经和第一个女孩配对,那就让第一个女孩另寻同伴,如果第一个女孩没有其他选择了,第二个女孩就应另做打算,如果第二个女孩也别无他选,那么第二个女孩就配对失败。以此类推,直至第n个女孩。

  • 细节:

每次循环开始时,都需要初始化变量;由于采用递归算法,应对程序进行结构优化。

  • 源代码:
    #include<bits/stdc++.h>
    using namespace std;
    int idea[510][510],boy[510],sign[510];
    int n,m;
    bool match(int x)
    {	
        int i;
        for(i=1;i<=m;i++)
        {
           if(idea[x][i]==1&&sign[i]==0)
           {
              sign[i]=1;
              if(boy[i]==0||match(boy[i]))
              {
                 boy[i]=x;
                 return true;
              }
           }
        }
        return false;
    }
    int main()
    {
        int i,k,x,y,sum;
        while(cin>>k&&k!=0)
        {
    	   cin>>n>>m;
    	   memset(idea,0,sizeof(idea));
           memset(boy,0,sizeof(boy));
           memset(sign,0,sizeof(sign));
           for(i=0;i<k;i++)
           {
              cin>>x>>y;
              idea[x][y]=1;
           }
           sum=0;
           for(i=1;i<=n;i++)
           {
               memset(sign,0,sizeof(sign));
               if(match(i)) sum++;
           }
           cout<<sum<<endl;
        }
        return 0;
    }
     
    

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值