原题链接

这道题,很明显是个配对问题。于是,我们可以想到用网络最大流来做。

先整理一下题目条件。

  1. 很明显,根据贪心思想,要使最多人满意,每个人应该最多睡一个房间(似乎也没有人能睡两个房间),吃一道菜。这就要求一个人最多与一个房间、一道菜配对。
  2. 每个人必须住进喜欢的房间且吃到喜欢的菜才算满意。
  3. 每道菜至多让1个人吃,每个房间至多让1个人睡。

于是,我们得出了建图的几大原则:

  1. 菜与房间分别作为一个点。
  2. 为了保证条件1,每个人应该拆成2个点,并在这两个点之间连一条容量为1的边。
  3. 为了保证条件2,应该让每一个人拆成的第一个点与所有自己喜欢的房间对应的点连一条容量为1的边,让每一个人拆成的第二个点与所有自己喜欢的菜对应的点连一条容量为1的边。
  4. 为了保证条件3,应该让源点\(s\)向所有的房间连一条容量为1的边,所有的菜向汇点\(t\)连一条容量为1的边。

放一张对应的图(样例):

最后EK跑最大流即可。

Code(超级精简,不到60行):

#include <bits/stdc++.h>
using namespace std;
int n,p,q,head[10005],tot=-1,st,ed,flow[10005],pre[10005],maxflow,vis[10005];
const int INF=0x3f3f3f3f;queue<int> qq;
struct Edge{int to,nxt,flow;}e[200005];
void addedge(int x,int y,int f){
e[++tot].to=y;e[tot].nxt=head[x];e[tot].flow=f;head[x]=tot;
e[++tot].to=x;e[tot].nxt=head[y];e[tot].flow=0;head[y]=tot;
}
bool bfs(){
memset(vis,0,sizeof(vis));memset(flow,0,sizeof(flow));flow[st]=INF;
while(!qq.empty()) qq.pop();
qq.push(st);vis[st]=1;
while(!qq.empty()){
int x=qq.front();qq.pop();
for(int i=head[x],y;i!=-1;i=e[i].nxt){
if(e[i].flow>0){
y=e[i].to;
if(vis[y]) continue;
flow[y]=min(flow[x],e[i].flow);pre[y]=i;
vis[y]=1;qq.push(y);
if(y==ed) return 1;
}
}
}
return 0;
}
void doit(){
while(bfs()){
int tmp=ed;maxflow+=flow[ed];
while(tmp!=st){
e[pre[tmp]].flow-=flow[ed],e[pre[tmp]^1].flow+=flow[ed];
tmp=e[pre[tmp]^1].to;
}
}
}
int main(){
memset(head,-1,sizeof(head));
scanf("%d%d%d",&n,&p,&q);
st=0,ed=2*n+p+q+1;
for(int i=1;i<=n;i++){
addedge(i+p,i+n+p,1);
for(int j=1;j<=p;j++){
int x;scanf("%d",&x);
if(x) addedge(j,i+p,1);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=q;j++){
int x;scanf("%d",&x);
if(x) addedge(i+p+n,n*2+p+j,1);
}
}
for(int i=1;i<=p;i++) addedge(st,i,1);
for(int i=1;i<=q;i++) addedge(i+n*2+p,ed,1);
doit();printf("%d\n",maxflow);
return 0;
}

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

  1. luogu P1402 酒店之王

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

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

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

  3. 【luogu P1402 酒店之王】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1402 菜 #include <queue> #include <cstdio> #i ...

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

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

  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. MySQL 向表中插入、删除数据

    一.向表中插入一条信息 1.查看表中的数据 mysql> SELECT * FROM user; +----+---------+----------+ | id | account | pas ...

  2. 伺服电机的Arduino库函数

    servo.attach(pin)  //连接伺服电机的信号线于控制板的引脚,9或10号引脚servo.attach(pin, min, max) servo: a variable of type ...

  3. linux启动过程中建立临时页表

    intel的x86这种架构为了兼容以前同系列的架构有一些很繁琐无用的东西.比如分段和分页两种机制都可以实现隔离进程的内存空间,在x86上两种机制都有,用起来比较繁琐.所以linux内核在启动的时候通过 ...

  4. 试用 Azure Sql 数据库

    我们的12月试用账号的免费服务里有一个Azure Sql服务,最近正好自己做一个小工具需要一个数据库,正好可以把它当测试库顺便体验一把Azure Sql. 概述 Azure SQL 数据库 Azure ...

  5. 一文看懂Vue3.0的优化

    1.源码优化: a.使用monorepo来管理源码 Vue.js 2.x 的源码托管在 src 目录,然后依据功能拆分出了 compiler(模板编译的相关代码).core(与平台无关的通用运行时代码 ...

  6. MeteoInfoLab脚本示例:FY-3A AOD HDF数据

    FY3A卫星有HDF格式的AOD产品数据,全球范围,分辨率为0.05度.读取数据文件变量后要重新设定X/Y维,数据是Y轴反向的,且需要除以10000得到AOD值. 脚本程序: #Add data fi ...

  7. jquery的实时触发事件(textarea实时获取中文个数)

    jquery的实时触发事件(textarea实时获取中文个数) (2014-09-16 11:49:50) 转载▼ 标签: 实时触发事件 中文个数 onpropertychange oninput o ...

  8. svn:E170001:Authorization failed解决

    eclipse添加svn资源库:打开eclipse→Window→SVN资源库→空白处右键新建资源库位置→填写正确的URL→finish 错误信息: 原因一:用户名或密码错误 因svn登录验证的账号信 ...

  9. 通透,23 个问题 TCP 疑难杂症全解析

    每个时代,都不会亏待会学习的人. 在进入今天主题之前我先抛几个问题,这篇文章一共提出 23 个问题. TCP 握手一定是三次?TCP 挥手一定是四次? 为什么要有快速重传,超时重传不够用?为什么要有 ...

  10. 第二章 rsync服务原理

    一.备份 1.什么是备份? 1)把重要的数据或者文件再次复制一份并保存下来 2.为什么要做备份? 1)数据的重要性 2)为了出现故障,恢复数据 3.能不能不备份? 1)重要的数据一定要备份 2)不重要 ...