杭电OJ 2063 过山车(匈牙利算法)

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);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值