P1402 酒店之王

提交 5.39k
通过 2.16k
时间限制 1.00s
内存限制 125.00MB
题目提供者yeszy
历史分数100

提交记录

查看算法标签
进入讨论版

相关讨论

 
查看讨论

推荐题目

 
查看推荐
 

展开

题目描述

XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化。由于很多来住店的旅客有自己喜好的房间色调、阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜。

有一天来了n个客人,每个客人说出了自己喜欢哪些房间,喜欢哪道菜。但是很不幸,可能做不到让所有顾客满意(满意的条件是住进喜欢的房间,吃到喜欢的菜)。

这里要怎么分配,能使最多顾客满意呢?

输入格式

第一行给出三个正整数表示n,p,q(<=100)。

之后n行,每行p个数包含0或1,第i个数表示喜不喜欢第i个房间(1表示喜欢,0表示不喜欢)。

之后n行,每行q个数,表示喜不喜欢第i道菜。

输出格式

最大的顾客满意数。

输入输出样例

输入 #1
  1. 2 2 2
  2.  
  3. 1 0
  4.  
  5. 1 0
  6.  
  7. 1 1
  8.  
  9. 1 1
输出 #1
  1. 1
  2.  
  3. 思路:
      本来想用来练习二分匹配,但是发现匈牙利算法好像无法解决两个关联的二分图问题,画的图却很像拆点的最大流。
      只要把菜或房单独连向超级源、汇,再把人拆开做一个流入流出,随后套dinic的模板就行了。
      不知道为什么ISAP只能过7个点,如果有ISAP过的同学可以教教我嘛。
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. const int maxn = ;
  5.  
  6. int s,t,flow;
  7. int head[maxn];
  8. int pre[maxn];
  9. int n,p,q;
  10. int cnt = ;
  11. int a[maxn];
  12.  
  13. template<class T>inline void read(T &res)
  14. {
  15. char c;T flag=;
  16. while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
  17. while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
  18. }
  19.  
  20. struct Edge {
  21. int to, nxt, cap;
  22. }edge[maxn];
  23.  
  24. void BuildGraph(int u, int v, int cap) {
  25. edge[++cnt].to = v;
  26. edge[cnt].nxt = head[u];
  27. edge[cnt].cap = cap;
  28. head[u] = cnt;
  29.  
  30. edge[++cnt].to = u;
  31. edge[cnt].nxt = head[v];
  32. edge[cnt].cap = ;
  33. head[v] = cnt;
  34. }
  35.  
  36. bool bfs() {
  37. queue <int> q;
  38. memset(a, , sizeof(a));
  39. a[s] = 0x3f3f3f3f;
  40. q.push(s);
  41. while(!q.empty()) {
  42. int u = q.front();
  43. q.pop();
  44. for(int i = head[u]; i; i = edge[i].nxt) {
  45. int to = edge[i].to;
  46. if(!edge[i].cap) {
  47. continue;
  48. }
  49. if(a[to]) {
  50. continue;
  51. }
  52. a[to] = min(a[u], edge[i].cap);
  53. pre[to] = i;
  54. q.push(to);
  55. }
  56. }
  57. if(!a[t]) {
  58. return ;
  59. }
  60. flow += a[t];
  61. return ;
  62. }
  63.  
  64. void Dinic() {
  65. int m = t;
  66. for(; pre[m]; m = edge[pre[m]^].to) {
  67. edge[pre[m]].cap -= a[t];
  68. edge[pre[m]^].cap += a[t];
  69. }
  70. }
  71.  
  72. int main()
  73. {
  74. read(n), read(p), read(q);
  75. s = *n+q+p+;
  76. t = s+;
  77. for(int i = ; i <= n; ++i) {
  78. for(int x, j = ; j <= p; ++j) {
  79. read(x);
  80. if(x) {
  81. BuildGraph(j, p+i, );
  82. }
  83. }
  84. }
  85. for(int i = ; i <= n; ++i) {
  86. for(int x, j = ; j <= q; ++j) {
  87. read(x);
  88. if(x) {
  89. BuildGraph(p+n+q+i, p+n+j, );
  90. }
  91. }
  92. }
  93. for(int i = ; i <= n; ++i) {
  94. BuildGraph(p+i, p+n+q+i,);
  95. }
  96. for(int i = ; i <= p; ++i) {
  97. BuildGraph(s, i, );
  98. }
  99. for(int i = p+n+; i <= p+q+n; ++i) {
  100. BuildGraph(i, t, );
  101. }
  102. while(bfs()) {
  103. Dinic();
  104. }
  105. printf("%d\n",flow);
  106. return ;
  107. }

P1402 酒店之王【网络流】【最大流】的更多相关文章

  1. P1402 酒店之王 网络流

    大水题,我自己瞎做就做出来了,没啥说的,zz建图,就是板子. 题干: 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等, ...

  2. LUOGU P1402 酒店之王 (网络流)

    解题思路 应该比较显然得能看出这是个网络流,将$S$与房间连边,房间与人连边,人与菜连边,菜与汇点连边,边的流量均为1.但这样是错误的,因为有可能一个人跑过去2的流量,所以要将人拆点限流. #incl ...

  3. 2018.08.19 洛谷P1402 酒店之王(最大流)

    传送门 最大流入门题,把人拆点即可. 代码: #include<bits/stdc++.h> #define N 505 using namespace std; inline int r ...

  4. 洛谷P2891 Dining P1402 酒店之王【类二分图匹配】题解+代码

    洛谷P2891 Dining P1402 酒店之王[类二分图匹配]题解+代码 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的 ...

  5. P1402 酒店之王

    P1402 酒店之王 每个人要匹配一个A和一个B,所以这样连边: S向每个房间连边. 每个房间向喜欢这个房间的人连边. 每个人向喜欢的菜连边. 每道菜向T连边. 边权均为1. 注意人要限流. // I ...

  6. 「LuoguP1402」 酒店之王(最大流

    题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...

  7. 洛谷P1402 酒店之王(二分图)

    P1402 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只 ...

  8. P1402 酒店之王 最大流

    \(\color{#0066ff}{ 题目描述 }\) XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该 ...

  9. 【刷题】洛谷 P1402 酒店之王

    题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...

随机推荐

  1. JS推箱子游戏

    <!DOCTYPE html><html><head><meta charset="UTF-8"><title>Inse ...

  2. 关于simplememory theme的设置和感想

    前言 首先,这是我第一次自己个性化博客的主题.如果下文所写如有不妥之处还望大佬指出 参考 这次设置多亏了GitHub上的开源代码:https://github.com/BNDong/Cnblogs-T ...

  3. SpringBoot安全管理--(二)基于数据库的认证

    简介: 上篇文章向读者介绍的认证数据都是定义在内存中的,在真实项目中,用户的基本信息以及角色等都存储在数据库中,因此需要从数据库中获取数据进行认证. 开始: 首先建表并且插入数据: pom.xml & ...

  4. 聊聊GIS中的坐标系|再版 识别各种数据的坐标系及代码中的坐标系

    本篇讲讲在GIS桌面软件和实际数据中,以及各路GIS有关API的编程中,如何寻找坐标系信息.惯例: 本文约2000字,建议阅读时间10分钟. 作者:博客园/B站/知乎/csdn/小专栏 @秋意正寒 版 ...

  5. PostgreSQL将日期转为当前年、月、日的函数date_trunc

    PostgreSQL将日期转为年.月.日的函数date_trunc: 当前年: select  date_trunc('year',now()) 当前月: select  date_trunc('mo ...

  6. Linux nohup不输出日志文件的方法

    引用:https://blog.csdn.net/guotao15285007494/article/details/84136234 最近在Linux上部署视频流推送应用时,由于网络不稳定等原因程序 ...

  7. CMD命令下图片合成一句话木马命令

    非常简单,我们只需要一张图片1.jpg一句话木马写好的php文件 1.php之后我们进入到命令行.注意:将php文件和图片文件放到同一目录下,cmd也要跳转到放文件的目录下之后执行命令 copy .j ...

  8. MySql学习-5.查询2

    1.聚合: 1.1 5个聚合函数: count(*):括号中写列名,或者 *: max(列):此列的最大值: min(列):此列的最小值: sum(列):此列的和: avg(列):此列的平均值: 1. ...

  9. svn cleanup 失败问题解决

    将sqlite3.exe放到.svn的同级目录 4.启动cmd执行sqlite3 .svn/wc.db "select * from work_queue" 5.启动cmd执行sq ...

  10. Centos中Redis的下载编译与安装(超详细)

    场景 NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充.随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数 ...