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数组开成二维的不就行了。
link[i][0]表示第i排一号座位与哪个人匹配link[i][0]表示第i排一号座位与哪个人匹配link[i][0]表示第i排一号座位与哪个人匹配
link[i][1]表示第i排二号座位与哪个人匹配link[i][1]表示第i排二号座位与哪个人匹配link[i][1]表示第i排二号座位与哪个人匹配

修改后的匈牙利算法:

bool find(int x)
{for(int i=hd[x]; i; i=e[i].next){int y=e[i].v;  //枚举第几排if(!cover[y]) //判断是否选过当前排(只对于x这个人){cover[y]=1;  //标识(只对于x这个人)if(!link[y][0] || find(link[y][0])) //表示壹号座位是否能与x匹配{link[y][0]=x; return 1;}if(!link[y][1] || find(link[y][1])) //表示二号座位是否能与x匹配{link[y][1]=x; return 1;}}}return 0;
}

然后我们知道了匈牙利算法怎么做,接着就要考虑怎么建图了。

邻接矩阵的复杂度:O(n2mn^2mn2m)
邻接表的复杂度:O(2n×m2n \times m2n×m) 好像是吧,请大佬斧正!

所以我们分析完复杂度,便可以知道,邻接矩阵是会T的,便采用邻接表。

code:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#define fre(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout);
#define ll long longusing namespace std;const int MAX=2147483647;
const int N=4e3+10;
struct node {int u, v, next;} e[2*N];
int n, a, b, hd[N], tot, cover[N], link[N][2], ans; void add(int x,int y) {e[++tot]=(node){x,y,hd[x]}; hd[x]=tot;}bool find(int x)
{for(int i=hd[x]; i; i=e[i].next){int y=e[i].v;if(!cover[y]) {cover[y]=1;if(!link[y][0] || find(link[y][0])) {link[y][0]=x; return 1;}if(!link[y][1] || find(link[y][1])){link[y][1]=x; return 1;}}}return 0;
}int main()
{//fre();scanf("%d",&n);for(int i=1; i<=2 * n; i++){scanf("%d%d", &a, &b);add(i, a), add(i, b);}for(int i=1; i<=2 * n; i++)   {memset(cover,0,sizeof(cover)); if(find(i)) ans++;}printf("%d", ans);return 0;
}

P2071 座位安排相关推荐

  1. 洛谷 P2071 座位安排 seat.cpp/c/pas

    P2071 座位安排 seat.cpp/c/pas 题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛, ...

  2. P2071 座位安排(二分图最大匹配)

    P2071 座位安排(二分图最大匹配) 照着模板的套路,只不过座位是可以匹配两个人的,所以开个二维数组即可. 匈牙利常见的优化,vis数组能用bool就用bool,貌似用bitset更快?,建图的话单 ...

  3. (二分图)洛谷P2071座位安排

    洛谷P2071座位安排 思路: 网络流难在建图上面. 这题(应该也可以,我没尝试过)用二分图匹配去跑.可以拆点,将一排的座位拆成两个点,一个iii,一个i+ni+ni+n,然后匈牙利算法跑. 也可以用 ...

  4. 【luogu P2071 座位安排】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2071#sub 邻接表 + 匈牙利 把之前的邻接矩阵匈牙利变成邻接表 要不然存不下... code: 1 #i ...

  5. 洛谷 P2071 座位安排 (最大流 + 建图)

    2020.7.15 今天先开个小差,这图书馆接近零下的气温给爷冻傻了,这还咋写题?马上回去了,练一练网络和tarjan吧. 这道题很简单,问有2n个人,n排座位,每个人都有喜欢的两个座位,最多能安置多 ...

  6. 洛谷P2071 座位安排

    题目背景 公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决. 题目描述 已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最 ...

  7. 婚宴座位图html5,图解现代婚宴座位安排

    中国人衣.食.住.行素来都有"礼"可循.对于婚宴来说更是讲究,桌子的摆放,座位的安排都需要经过深思熟虑.因为小小的桌椅就关系到婚宴的礼仪以及宾客的身份.下面就让专家为我们进行图解婚 ...

  8. 婚宴座位图html5,婚宴酒席座位安排图 20桌婚宴座位安排图

    婚宴酒席座位安排图 20桌婚宴座位安排图 作者: 咖啡 更新日期: 2020-09-25 23:18:48 我们在安排婚宴的时候,要将熟人安排在同一个地方,这样他们坐在一起吃饭的时候也能聊聊天,而且要 ...

  9. 婚宴座位图html5,婚礼酒席座位该怎么安排好?婚宴座位安排图解

    新人在筹备婚礼的时候,会遇到各种各样的问题大难题之宾客座位如何安排?婚礼酒席座位也是极其重要的,婚宴座位安排向来是中国婚礼上比较重视的话题,婚宴座位怎么安排就能看出来宾和新人之间的关系,是长辈还是领导 ...

最新文章

  1. Ubuntu下允许Root用户直接登录图形界面
  2. 数据图表可视化_数据可视化十大最有用的图表
  3. Mybatis框架插件PageHelper的使用
  4. 华谊兄弟:实际控制人王忠军、王忠磊合计减持1.44%公司股份
  5. [转载] api地理编码_通过地理编码API使您的数据更有意义
  6. Android Cloud to Device Messaging 服务介绍 – 如何使用云计算推送消息到手机(转载)...
  7. Egret入门学习日记 --- 第八篇(书中 2.0~2.6节 内容)
  8. 1992-2021合集 全国大学生数学建模竞赛(历年赛题题目+定位分析)
  9. 2023秋招大厂经典面试题及答案整理归纳(101-120)校招必看
  10. python扩展包怎么安装_Python中扩展包的安装方法详解
  11. 一台电脑有几个计算机用户账户,多人共用一台电脑设置多个使用账户的方法
  12. 分层确定性钱包(HD Wallets)
  13. 企业文化五因素论(转载)
  14. 阿里巴巴Canal原理剖析
  15. ionic4开发微信小程序_15个适用于Ionic应用程序开发人员的资源
  16. 微信公众号最佳实践 ( 9.1)会员卡
  17. 荣耀3手机android 5.0吗,华为荣耀3的手机系统是什么?华为荣耀3能升级安卓4.3吗?...
  18. docker进入容器的方法
  19. matlab用app建立神经网络,Matlab Deep Network Designer APP搭建神经网络及相关函数讲解...
  20. 不懂如何安排时间?这四个技巧帮你摆脱拖延症

热门文章

  1. 安全狗防护引擎安装失败
  2. php常见后门,php后门隐藏技巧大全
  3. 下载 axios.js 文件到本地
  4. MSVS2008和VS2010的痛苦加装
  5. Duang~Shark 闪跌 99%! Fork 了 Bunny 的代码还 Fork 了它的攻击
  6. JAVA中随机数的生成方法
  7. 使用parted创建大分区时 mkpart Warning: The resulting partition is not properly aligned for best performance.
  8. ValueError: With n_samples=1, test_size=0.2 and train_size=None, the resulting train set will be
  9. 小小白学习c语言分享
  10. 解析访问www.baidu.com百度的流程?