HDU ACM 11 2063 过山车(二分图匈牙利算法)

这题要用二分图。

二分图的解释实在懒得写了。麻烦各位自己百度一下吧。二分图理解很简单,难点在代码的理解,代码的注释我会给齐的。

#include <iostream>
using namespace std;
int K, M, N;
int Lu[1001][1001], Hui[1001], Yi[1001]; //二维数组Lu保存了男女之间能否配对的信息(实现见29行的for循环);Hui则表示男生是否被匹配;Yi在下面解释
int find(int girl) //先看下面的main主函数再回头看这个比较好
{
	for (int i = 1; i <= N; i++) //历遍男生
	{
		if (Lu[girl][i] && !Yi[i]) //如果该男生可与女生配对且此男生未被配对(数组Yi的作用在此,难点就在理解数组Yi作用)
		{
			Yi[i] = 1;
			if (!Hui[i] || find(Hui[i])) //数组Y其实为这里服务,假如前面的!Hui条件不成立,即男生已经被抢走,那么执行find(Hui[i])(下接)
			{                            //执行find(Hui[i])的目的是为了尝试是否可以为前一位女生重新找一个,方便为现在这个女生腾出她之前占有的男生(下接)
				Hui[i] = girl;           //因为此时还在find函数中循环,所以数组Yi未被初始化,Yi[i]被此时的女生占领,前一位女生就要跳过这个男生找下一个
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	while (cin >> K && K)
	{
		memset(Lu, 0, sizeof(Lu));
		memset(Hui, 0, sizeof(Hui));
		cin >> M >> N;
		int girl, boy, sum = 0;
		for (int i = 1; i <= K; i++)
		{
			cin >> girl >> boy;
			Lu[girl][boy] = 1;
		}
		for (int i = 1; i <= M; i++)
		{
			memset(Yi, 0, sizeof(Yi));
			sum += find(i);
		}
		cout << sum << endl;
	}
	return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值