Problem Description
RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
Input
输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=1000
1<=N 和M<=500.接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个0结束输入。
Output
对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。
Sample Input
6 3 3 1 1 1 2 1 3 2 1 2 3 3 1 0
Sample Output
3
// 新手,记个代码
一个简单易懂的匈牙利算法帖子:https://blog.csdn.net/cillyb/article/details/55511666
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<ctype.h>
#include<limits.h>
int k,m,n;
int girl[1000][1000]; //[第几人][是否有想法]
int judge[1000];
int boy[1000]= {0};
int find(int x) { //调配
int i,j;
for(i = 1; i<=n; i++) { //每一位女生 遍历男生
if(girl[x][i]==1&&judge[i]==0) { //judge不对当前已配对 再次重复配对
judge[i]=1;
if(boy[i]==0||find(boy[i])) { //即使男的已经被分配了,也要试试能不能给对应的那个女的调配另一个男的。
boy[i]=x;
return 1;
}
}
}
return 0;
}
int main() {
int find(int);
int x,y;
while(scanf("%d",&k)!=EOF&&k) {
memset(girl,0,sizeof(girl)); //初始化数组
memset(boy,0,sizeof(boy)); //初始化数组
scanf("%d%d",&m,&n);
int count = 0; //记录成功组合的数量
while(k--) { //二维数组第二维度存放有想法的男生标号
scanf("%d%d",&x,&y);
girl[x][y]=1;
}
for(int i = 1; i<=m; i++) {
memset(judge,0,sizeof(judge)); // 没一个新人都没有对男生匹配过,所以全置0
if(find(i)) count++;
}
printf("%d\n",count);
}
}