「LuoguP1402」 酒店之王(最大流

题目描述

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

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

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

输入输出格式

输入格式:

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

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

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

输出格式:

最大的顾客满意数。

输入输出样例

输入样例#1:
复制

2 2 2
1 0
1 0
1 1
1 1

输出样例#1: 复制

1

题解

这是道三倍经验题。

@hongzy 2018-10-05 22:14 回复

P1402 酒店之王

P2891 [USACO07OPEN]吃饭Dining

P1231 教辅的组成

三题读入不一样,P1231数据范围稍大一点,就这点区别。。

对人拆点,设为$x_1,x_2$。

从$S$往每个房间连边,容量为$1$。

从每个房间往喜欢它的$x_1$连边,容量为$1$。

从每个$x_1$往对应的$x_2$连边,容量为$1$。(限流

从每个$x_2$往他喜欢的菜连边,容量为$1$。

最后从每道菜往$T$连$1$,跑最大流就是答案了。

  1 /*
  2     qwerta
  3     P1402 酒店之王
  4     Accepted
  5     100
  6     代码 C++,1.69KB
  7     提交时间 2018-10-13 10:38:07
  8     耗时/内存
  9     34ms, 796KB
 10 */
 11 #include<iostream>
 12 #include<cstring>
 13 #include<cstdio>
 14 #include<queue>
 15 using namespace std;
 16 struct emm{
 17     int e,f,v;
 18 }a[50003];
 19 int h[413];
 20 int tot=1;
 21 void con(int x,int y,int ds)
 22 {
 23     a[++tot].f=h[x];
 24     h[x]=tot;
 25     a[tot].e=y;
 26     a[tot].v=ds;
 27     a[++tot].f=h[y];
 28     h[y]=tot;
 29     a[tot].e=x;
 30     return;
 31 }
 32 queue<int>que;
 33 int d[413];
 34 int s,t;
 35 inline bool bfs()
 36 {
 37     memset(d,0,sizeof(d));
 38     d[s]=1;que.push(s);
 39     while(!que.empty())
 40     {
 41         int x=que.front();que.pop();
 42         for(int i=h[x];i;i=a[i].f)
 43         if(!d[a[i].e]&&a[i].v)
 44         {
 45             d[a[i].e]=d[x]+1;
 46             que.push(a[i].e);
 47         }
 48     }
 49     return d[t];
 50 }
 51 int dfs(int x,int al)
 52 {
 53     if(x==t||!al)return al;
 54     int fl=0;
 55     for(int i=h[x];i;i=a[i].f)
 56     if(d[a[i].e]==d[x]+1&&a[i].v)
 57     {
 58         int f=dfs(a[i].e,min(al,a[i].v));
 59         if(f)
 60         {
 61             fl+=f;
 62             al-=f;
 63             a[i].v-=f;
 64             a[i^1].v+=f;
 65             if(!al)break;
 66         }
 67     }
 68     if(!fl)d[x]=-1;
 69     return fl;
 70 }
 71 int main()
 72 {
 73     //freopen("a.in","r",stdin);
 74     int n,p,q;
 75     scanf("%d%d%d",&n,&p,&q);
 76     s=0,t=2*n+p+q+1;
 77     for(int i=1;i<=p;++i)
 78       con(s,i,1);
 79     for(int i=1;i<=n;++i)
 80     {
 81         for(int j=1;j<=p;++j)
 82         {
 83             int x;
 84             scanf("%d",&x);
 85             if(x)
 86             con(j,i+p,1);
 87         }
 88     }
 89     for(int i=1;i<=n;++i)
 90       con(i+p,i+p+n,1);
 91     for(int i=1;i<=n;++i)
 92     {
 93         for(int j=1;j<=q;++j)
 94         {
 95             int x;
 96             scanf("%d",&x);
 97             if(x)
 98             con(i+p+n,j+p+n+n,1);
 99         }
100     }
101     for(int i=1;i<=q;++i)
102     con(i+p+n+n,t,1);
103     int ans=0;
104     while(bfs())ans+=dfs(s,99999999);
105     cout<<ans;
106     return 0;
107 }

原文地址:https://www.cnblogs.com/qwerta/p/9807276.html

时间: 2024-10-13 23:21:41

「LuoguP1402」 酒店之王(最大流的相关文章

P1402 酒店之王 最大流

\(\color{#0066ff}{ 题目描述 }\) XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. 有一天来了n个客人,每个客人说出了自己喜欢哪些房间,喜欢哪道菜.但是很不幸,可能做不到让所有顾客满意(满意的条件是住进喜欢的房间,吃到喜欢的菜). 这里要怎么分配,能使最多顾客满意呢? $\color{#0066ff}{ 输入格式 } $ 第一行给出三

「网络流」

$Tasklist$ 无限之环 星际竞速 4823: 老C的方块 2007: 海拔 还有51nod上的 集合交易 「奇怪的游戏」:小学数学+最大流 如果不相等,算出来要多叠多少层,否则答案具有二分性.check用最大流 土兵占领:补集转化+最小割 转化为最多有多少士兵能同时给一行和一列作出贡献,然后最小割可以做 「紧急疏散」:增量+最大流 必须根据时间拆点,而不能每经过一个时间给终点流量+1,因为不能让后面的人占用前面的流量 狼抓兔子:最小割/对偶图 不管写最小割还是对偶图都是模板 「切糕」:最

LibreOJ #2006. 「SCOI2015」小凸玩矩阵

二次联通门 : LibreOJ #2006. 「SCOI2015」小凸玩矩阵 /* LibreOJ #2006. 「SCOI2015」小凸玩矩阵 本来以为是道数据结构题 后来想了想发现不可做 就考虑二分dp判断 推方程推不出来 就考虑用网络流判断了 二分出一个数 将小于这个数的位置的点编号 每行的可行点与下一行可行的点连边 后一边最大流判断可选出的数的个数是否符合要求即可 */ #include <cstdio> #include <iostream> #include <q

酒店之王

酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. 有一天来了n个客人,每个客人说出了自己喜欢哪些房间,喜欢哪道菜.但是很不幸,可能做不到让所有顾客满意(满意的条件是住进喜欢的房间,吃到喜欢的菜). 这里要怎么分配,能使最多顾客满意呢? 输入输出格式 输入格式: 第一行给出三个正整数表示n,p,q(<=100). 之后n行,每行p个数包含

[洛谷 P1402] 酒店之王

题目描述 Description XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜.有一天来了n个客人,每个客人说出了自己喜欢哪些房间,喜欢哪道菜.但是很不幸,可能做不到让所有顾客满意(满意的条件是住进喜欢的房间,吃到喜欢的菜).这里要怎么分配,能使最多顾客满意呢? 输入输出格式 Input/output 输入格式:第一行给出三个正整数表示n,p,q(<=1

分布式系统关注点——99%的人都能看懂的「熔断」以及最佳实践

当我们工作所在的系统处于分布式系统初期的时候,往往这时候每个服务都只部署了一个节点. 如果想学习Java工程化.高性能及分布式.深入浅出.微服务.Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家. 那么在这样的背景下,如果某个服务A需要发布一个新版本,往往会对正在运行的其它依赖服务A的程序产生影响.甚至,一旦服务A的启动预热过程耗时过长,问题会更严重,大量请求会阻塞,产

「CodeForces-498C」Array and Operations(数论+网络流)

「CodeForces-498C」Array and Operations给定n个点和m个边集,每次操作可以将相连边的两个点值同时除以一个公约数,问最大操作次数 题意 给定一个长为$n$的数组,以及$m$对下标为$(a,b)$的点对,且满足下标a+b为奇数(即奇数点只与偶数点匹配),每次操作可以将同一组的两个数同时除以一个公约数,问最多能进行多少次操作. 解法 显然题目所给的是一个二分图. 对于每个质因数分开考虑.对于奇数点,向源点连接一个容量为该因子个数的边:对于偶数点,则向汇点建立一个容量为

AC日记——「HNOI2017」单旋 LiBreOJ 2018

#2018. 「HNOI2017」单旋 思路: set+线段树: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxtree maxn<<2 int val[maxtree],tag[maxtree],L[maxtree],R[maxtree],mid[maxtree]; int op[maxn],ki[maxn],bi[maxn],cnt,size,n,ch[maxn]

「随笔」基于当下的思考

马德,说好的技术blog,变成日记本了... 下午的时候莫名其妙的感到很颓废,因为自己的不够强大感到忧虑和危机感十足.现在每每行走在技术的道路上,常觉得如履薄冰,如芒在背. 上大学之前和现在的心态其实差别挺大的,视野的开阔远远不止局限于自己的脚下.不过,这里的「上大学之前」只是一个时间描述词,并不觉得大学是最适合学习的地方,我很失望. 世界上的人无论性别,区域,宗教,兴趣爱好,总可以在互联网上找到志趣相同的人,总是可以不断打破自己的常识与惯性思维.总是有在相同领域比自己更强的人,挺好的. 关于知