P2071 座位安排

P2071 座位安排

题目背景
公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决。

题目描述
已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。

输入格式
第一行,一个正整数N。

第二行至第N*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数。

输出格式
一个非负整数,为最多使得多少人满意。

输入输出样例
输入

4
1 2
1 3
1 2
1 3
1 3
2 4
1 3
2 3

输出

7

说明/提示
对于10%的数据 N≤10
对于30%的数据 N≤50
对于60%的数据 N≤200
对于100%的数据 N≤2000

思路:
像这样有两个不同的集合,问你两集合间最多能有多少匹配的问题。我们都采用最大匹配—二分图。

对于这道题我们如何去变成最大匹配问题呢?(他可是有一排两个座位

我们一般的匈牙利算法的模板如下:

bool find(int x)
{
   
	for(int i=1; i<=m; i++)
	{
   
		if(!cover[i] && e[x][i])
		{
   
			cover[i]=1;
			int q=link[i];
			link[i]=x;
			if(!q || find(q)) return 1;
			link[i]=q;
		}
	}
	return 0;
}

我们想,link[i]表示右图中i能与左图的哪个数相匹配。

那如果我们把右图看成座位,link[i]表示第i排座位与哪两个人匹配。那大家就很容易想出,题目既然规定一排两个座位,那我们就将link数组开成二维的不就行了。
l i n k [ i ] [ 0 ] 表 示 第 i 排 一 号 座 位 与 哪 个 人 匹 配 link[i][0]表示第i排一号座位与哪个人匹配

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值