题目链接:https://www.luogu.org/problemnew/show/P1402

  1. #include <queue>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. const int maxn = 1e6 + 10;
  8. const int inf = 1e9;
  9. int n, p, q, s, t, deep[maxn], maxflow;
  10. struct edge{
  11. int flow, next, to;
  12. }e[maxn<<2];
  13. int head[maxn], cnt = -1;
  14. queue<int> q1;
  15. void add(int u, int v, int w)
  16. {
  17. e[++cnt].flow = w; e[cnt].next = head[u]; e[cnt].to = v; head[u] = cnt;
  18. e[++cnt].flow = 0; e[cnt].next = head[v]; e[cnt].to = u; head[v] = cnt;
  19. }
  20. bool bfs(int s, int t)
  21. {
  22. memset(deep, 0x7f, sizeof(deep));
  23. while(!q1.empty()) q1.pop();
  24. q1.push(s); deep[s] = 0;
  25. while(!q1.empty())
  26. {
  27. int now = q1.front(); q1.pop();
  28. for(int i = head[now]; i != -1; i = e[i].next)
  29. {
  30. if(deep[e[i].to] > inf && e[i].flow)
  31. {
  32. deep[e[i].to] = deep[now] + 1;
  33. q1.push(e[i].to);
  34. }
  35. }
  36. }
  37. if(deep[t] < inf) return true;
  38. else return false;
  39. }
  40. int dfs(int now, int t, int limit)
  41. {
  42. if(!limit || now == t) return limit;
  43. int flow = 0, f;
  44. for(int i = head[now]; i != -1; i = e[i].next)
  45. {
  46. if(deep[e[i].to] == deep[now] + 1 && (f = dfs(e[i].to, t, min(e[i].flow, limit))))
  47. {
  48. flow += f;
  49. limit -= f;
  50. e[i].flow -= f;
  51. e[i^1].flow += f;
  52. if(!limit) break;
  53. }
  54. }
  55. return flow;
  56. }
  57. void Dinic(int s, int t)
  58. {
  59. while(bfs(s, t))
  60. maxflow += dfs(s, t, inf);
  61. }
  62. int main()
  63. {
  64. memset(head, -1, sizeof(head));
  65. scanf("%d%d%d",&n,&p,&q);
  66. s = 1, t = n + n + p + q + 2;
  67. for(int i = 1; i <= n; i++)
  68. for(int j = 1; j <= p; j++)
  69. {
  70. int u;
  71. scanf("%d",&u);
  72. if(u == 1)
  73. {
  74. add(j + n + n + 1, i + 1, 1);
  75. }
  76. }
  77. for(int i = 1; i <= n; i++)
  78. for(int j = 1; j <= q; j++)
  79. {
  80. int u;
  81. scanf("%d",&u);
  82. if(u == 1)
  83. {
  84. add(i + n + 1, j + n + n + p + 1, 1);
  85. }
  86. }
  87. for(int i = 1; i <= n; i++)
  88. add(i + 1, i + n + 1, 1);
  89. for(int i = 1; i <= p; i++)
  90. add(s, i + n + n + 1, 1);
  91. for(int i = 1; i <= q; i++)
  92. add(i + n + n + p + 1, t, 1);
  93. Dinic(s, t);
  94. printf("%d",maxflow);
  95. return 0;
  96. }

【luogu P1402 酒店之王】 题解的更多相关文章

  1. luogu P1402 酒店之王

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

  2. BZOJ 1711 吃饭dining/Luogu P1402 酒店之王 拆点+最大流流匹配

    题意: (吃饭dining)有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料.现在有n头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享 ...

  3. 【题解】 Luogu P1402 酒店之王 (二分图匹配)

    懒得复制,原题目戳我 Solution: 这题没想到这么水,就是两个二分图而已 如果房间的二分图没匹配成功就直接进入下一个人 如果房间的二分图匹配成功,食物二分图匹配不成功就把房间的\(be[ ]\) ...

  4. 【Luogu】P1402 酒店之王 题解

    原题链接 这道题,很明显是个配对问题.于是,我们可以想到用网络最大流来做. 先整理一下题目条件. 很明显,根据贪心思想,要使最多人满意,每个人应该最多睡一个房间(似乎也没有人能睡两个房间),吃一道菜. ...

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

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

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

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

  7. P1402 酒店之王【网络流】【最大流】

    P1402 酒店之王 提交 5.39k 通过 2.16k 时间限制 1.00s 内存限制 125.00MB 题目提供者yeszy 难度省选/NOI- 历史分数100 提交记录 查看题解 标签 福建省历 ...

  8. Luogu 1402 酒店之王(二分图最大匹配)

    Luogu 1402 酒店之王(二分图最大匹配) Description XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自 ...

  9. P1402 酒店之王

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

随机推荐

  1. 在Spark shell中基于Alluxio进行wordcount交互式分析

    Spark是一个分布式内存计算框架,可部署在YARN或者MESOS管理的分布式系统中(Fully Distributed),也可以以Pseudo Distributed方式部署在单个机器上面,还可以以 ...

  2. 白话SpringCloud | 第十一章:路由网关(Zuul):利用swagger2聚合API文档

    前言 通过之前的两篇文章,可以简单的搭建一个路由网关了.而我们知道,现在都奉行前后端分离开发,前后端开发的沟通成本就增加了,所以一般上我们都是通过swagger进行api文档生成的.现在由于使用了统一 ...

  3. wex5新增数据库

    首先是要打开Wex5   (这是废话,下面进入正题..) 1.第一步,找到界面中的 ”窗口” 点击打开,你会看到一个 “ 首选项 ”按照流程也要打开 (囧),,,,,,,,看图为重 2.当你打开了 “ ...

  4. AngularJS-自定义过滤器 ng-repeat 求和

    <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset="UTF-8& ...

  5. 获取当前的日期时间的js函数,格式为“yyyy-MM-dd hh:mm:ss”

    //获取当前的日期时间函数,格式为“yyyy-MM-dd hh:mm:ss” function getNowFormatDate(date) { if (date == null) { var dat ...

  6. Windows进程间通信--命名管道

    1 相关概述 命名管道(Named Pipes)是一种简单的进程间通信(IPC)机制.命名管道可以在同一台计算机的不同进程之间,或者跨越一个网络的不同计算机的不同进程之间的可靠的双向或单向的数据通信. ...

  7. C# 读写xml、excel、word、ppt、access

    C# 读写xml.excel.word.access 这里只是起个头,不做深入展开,方便以后用到参考 读写xml,主要使用.net  的xml下的document using System;using ...

  8. html+css动态篇

    transition过渡 transform旋转 animation动画 一般是父div包含两个子div,一个写鼠标悬浮之前,一个写鼠标悬浮之后, 鼠标悬浮之后的div要写overflow:hidde ...

  9. css随堂笔记(三)

    Css随堂笔记(三) 1 关于背景图片   A 设置背景图片:background-image:url(“图片的路径”):   B 背景图片位置: background-position:1 方位名词 ...

  10. r.js压缩打包

    AMD模块化开发中的代码压缩打包工具——r.js 环境搭建基于nodejs:用于AMD模块化开发中的项目文件压缩打包,不是AMD模式也是可以的 javascript部分 压缩javascript项目开 ...