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
2 2 2

1 0

1 0

1 1

1 1
输出 #1
1

思路:
  本来想用来练习二分匹配,但是发现匈牙利算法好像无法解决两个关联的二分图问题,画的图却很像拆点的最大流。
  只要把菜或房单独连向超级源、汇,再把人拆开做一个流入流出,随后套dinic的模板就行了。
  不知道为什么ISAP只能过7个点,如果有ISAP过的同学可以教教我嘛。
 #include <bits/stdc++.h>

 using namespace std;
const int maxn = ; int s,t,flow;
int head[maxn];
int pre[maxn];
int n,p,q;
int cnt = ;
int a[maxn]; template<class T>inline void read(T &res)
{
char c;T flag=;
while((c=getchar())<''||c>'')if(c=='-')flag=-;res=c-'';
while((c=getchar())>=''&&c<='')res=res*+c-'';res*=flag;
} struct Edge {
int to, nxt, cap;
}edge[maxn]; void BuildGraph(int u, int v, int cap) {
edge[++cnt].to = v;
edge[cnt].nxt = head[u];
edge[cnt].cap = cap;
head[u] = cnt; edge[++cnt].to = u;
edge[cnt].nxt = head[v];
edge[cnt].cap = ;
head[v] = cnt;
} bool bfs() {
queue <int> q;
memset(a, , sizeof(a));
a[s] = 0x3f3f3f3f;
q.push(s);
while(!q.empty()) {
int u = q.front();
q.pop();
for(int i = head[u]; i; i = edge[i].nxt) {
int to = edge[i].to;
if(!edge[i].cap) {
continue;
}
if(a[to]) {
continue;
}
a[to] = min(a[u], edge[i].cap);
pre[to] = i;
q.push(to);
}
}
if(!a[t]) {
return ;
}
flow += a[t];
return ;
} void Dinic() {
int m = t;
for(; pre[m]; m = edge[pre[m]^].to) {
edge[pre[m]].cap -= a[t];
edge[pre[m]^].cap += a[t];
}
} int main()
{
read(n), read(p), read(q);
s = *n+q+p+;
t = s+;
for(int i = ; i <= n; ++i) {
for(int x, j = ; j <= p; ++j) {
read(x);
if(x) {
BuildGraph(j, p+i, );
}
}
}
for(int i = ; i <= n; ++i) {
for(int x, j = ; j <= q; ++j) {
read(x);
if(x) {
BuildGraph(p+n+q+i, p+n+j, );
}
}
}
for(int i = ; i <= n; ++i) {
BuildGraph(p+i, p+n+q+i,);
}
for(int i = ; i <= p; ++i) {
BuildGraph(s, i, );
}
for(int i = p+n+; i <= p+q+n; ++i) {
BuildGraph(i, t, );
}
while(bfs()) {
Dinic();
}
printf("%d\n",flow);
return ;
}

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. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...

  2. 04.JS逻辑结构

    前言:  学习一门编程语言的基本步骤(01)了解背景知识(02)搭建开发环境(03)语法规范(04)常量和变量(05)数据类型(06)数据类型转换(07)运算符(08)逻辑结构8.逻辑结构——logi ...

  3. OpenResty + ngx_lua_waf使用

    本篇介绍在CentOS7.6上安装.测试使用ngx_lua_waf + openresty. Preface # yum install epel-release -y # yum group ins ...

  4. 常用类String的总结

    /* String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的. ...

  5. python命令行运行django项目, can't open file 'manage.py' 问题解决

     找到manage.py的绝对路径即可运行

  6. Q&A in 2018 - Q2

    How to zip a file for Windows? 压缩一个文件: makecab c:/file_name.txt c:/file_name.zip 解压一个文件: expand c:/f ...

  7. 关于javascript中的内置函数

    (1) parseInt()函数 语法:parseInt(string,[n])   该函数主要将首位为数字的字符串转化为数字,若该字符串不是以数字开头,则返回NaN; n是用于指出字符串中的数据是几 ...

  8. 10.HanLP实现k均值--文本聚类

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 10. 文本聚类 正所谓物以类聚,人以群分.人们在获取数据时需要整理,将相似的数据 ...

  9. Fhq Treap [FhqTreap 学习笔记]

    众所周知 Fhq Treap 是 fhq 神仙研究出来的平衡树- 具体实现 每个点实现一个 \(\text{rnd}\) 表示 rand 的值 为什么要 rand 呢 是为了保证树高为 \(\log ...

  10. PIE-SDK For C++矢量数据的投影转换

    1.功能简介 目前在地理信息领域中数据包括矢量和栅格两种数据组织形式,每一种数据都可以对投影进行转换,目前PIE SDK支持矢量和栅格数据的投影转换功能,下面对矢量数据的投影转换功能进行介绍. 2.功 ...