- 题目描述:
一群男女去玩过山车,每个女孩都有自己的想法,女孩只能和与自己想要的男孩一起坐过山车,如果没有找到自己的同伴,就无法坐过山车。问最多有多少组可以坐过山车。
- 思路:
先对第一个女孩寻找同伴,让女孩与其想组合的同伴组成一组,再对第二个女孩寻找同伴,如果第二个女孩的首选已经和第一个女孩配对,那就让第一个女孩另寻同伴,如果第一个女孩没有其他选择了,第二个女孩就应另做打算,如果第二个女孩也别无他选,那么第二个女孩就配对失败。以此类推,直至第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; }