LuoguP1402 酒店之王
LuoguP1402 酒店之王
最大流题目。带有一定的思维技(tao)巧(lu)
依旧分析题目。如果只有房间或者菜一种限制。那么就是一道裸的最大流了
可是两种条件都应当满足,
这貌似也可以做。
因为每个菜和房间都只能选择一次。我们很容易建出这样一个模型
上图中矩形表示房间,圆表示顾客,三角表示菜
但是很不幸,是错的
因为我们忽略了人的限制,每个菜和房间都只能选择一次,每个人也只能被选择一次,即上图中圆圈的点流量不超过\(1\)。
所以应该将每个圆圈拆成两个点,中间连一条容量为\(1\)的边,表示人数限制。
#include<cstdio>
#include<cctype>
#include<cstring>
#include<queue>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 2e5 + 3;
const int M = 2e6 + 3;
const int INF = 2e9;
struct edge{int to;int nxt;int flow;
}e[M];
int n,p,q,s,t,tot = 1;
int cur[N],head[N],high[N];
vector <int> G[N];
inline void add(int x,int y,int z){e[++tot].to = y;e[tot].flow = z;e[tot].nxt = head[x]; head[x] = tot;e[++tot].to = x;e[tot].flow = 0;e[tot].nxt = head[y];head[y] = tot;
}
inline int read(){int v = 0,c = 1;char ch = getchar();while(!isdigit(ch)){if(ch == '-') c = -1;ch = getchar(); }while(isdigit(ch)){v = v * 10 + ch - 48;ch = getchar(); }return v * c;
}
inline bool bfs(){queue <int> q;for(int i = 0;i <= t;++i) high[i] = 0;q.push(s);high[s] = 1;while(!q.empty()){int k = q.front();q.pop();for(int i = head[k];i;i = e[i].nxt){int y = e[i].to;if(!high[y] && e[i].flow > 0)high[y] = high[k] + 1,q.push(y);}}return high[t] != 0;
}
inline int dfs(int x,int dis){
// printf("%d %d\n",x,dis);
// system("pause");if(x == t) return dis;for(int &i = cur[x];i;i = e[i].nxt){int y = e[i].to;if(high[y] == high[x] + 1 && e[i].flow > 0){int flow = dfs(y,min(dis,e[i].flow));if(flow > 0){e[i].flow -= flow;e[i ^ 1].flow += flow;return flow; }}}return 0;
}
inline int dinic(){int res = 0;while(bfs()){for(int i = 0;i <= t;++i) cur[i] = head[i];while(int now = dfs(s,INF)) res += now;}return res;
}
int main(){n = read(),p = read(),q = read();s = n + n + p + q + 1,t = s + 1;for(int i = 1;i <= n;++i)for(int j = 1;j <= p;++j){int x = read(); if(x) add(j,i + p,1);}for(int i = 1;i <= p;++i) add(s,i,1);for(int i = 1;i <= n;++i) add(i + p,i + p + n,1);for(int i = 1;i <= n;++i)for(int j = 1;j <= q;++j){int x = read();if(x) add(i + p + n,n + n + p + j,1); }for(int i = 1;i <= q;++i) add(n + n + p + i,t,1);printf("%d\n",dinic());return 0;
}
转载于:https://www.cnblogs.com/wyxdrqc/p/10636640.html
LuoguP1402 酒店之王相关推荐
- 洛谷P1402 酒店之王(二分图)
P1402 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只 ...
- 洛谷P1402 酒店之王--网络流最大流拆点
题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...
- [洛谷P1402] 酒店之王
洛谷连接:酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有 ...
- Luogu 1402 酒店之王(二分图最大匹配)
Luogu 1402 酒店之王(二分图最大匹配) Description XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自 ...
- 洛谷 P1402 酒店之王
题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...
- 尚美生活获小米撑腰,下沉酒店之王打响“守擂赛”?
连锁酒店业出了个"下沉之王"尚美生活,但很难保证快速且有品质的扩张,这注定是一场"硬仗". 日前尚美生活获得了小米的战略投资,双方将共同探索未来"酒店 ...
- 洛谷P1402 酒店之王
传送门:>Here< 题意:有N个人去酒店,酒店共有P个房间,Q道菜.已知每个人喜欢特定的几个房间和几道菜,一个人是满意的当且仅当住了喜欢的房间,吃了喜欢的菜(一个人只能选一个房间一道菜) ...
- [luogu1402]酒店之王——最大流
题目大意: 有一个酒店有p种菜,q种房间,n个客人,每个客人都有着自己喜欢的菜和房间(可能会有多种),使一个客人满意当且仅当他的吃上自己喜欢的菜何住上自己喜欢的房间,问酒店老板最大可以使几个人满意. ...
- 10.15 lzxkj
几天前写的,忘了放了,在此填坑 10月16的题我出的不写题解了 lzxkj 题目背景 众所不周知的是, 酒店之王 xkj 一个经常迷失自我的人 有一天, 当起床铃再一次打响的时候, TA 用 O(1) ...
最新文章
- Centos下安装apahce的configure: error: APR not found. Please read the documentation解决办法
- 【小白学PyTorch】 2.浅谈训练集验证集和测试集
- Qt 给应用程序添加图标
- c语言格式化知识点(sscanf)
- 10个有关String的面试问题
- 前端:JS/17/前篇总结(JS程序的基本语法,变量),数据类型-变量的类型(数值型,字符型,布尔型,未定义型,空型),数据类型转换,typeof()判断数据类型,从字符串提取整数或浮点数的函数
- java 字符串 字节数组_字符串到字节数组,字节数组到Java中的字符串
- 设置javadoc模板
- SQL Server的下载和安装
- VUE调用高德地图之热力图
- 网络协议、socket、webSocket
- 用python实现自动化办公------爬取小说天堂所有小说
- dw怎么把dwt文件转成html文件,在Dreamweaver中如何使用模板?
- 3D游戏中角色的换装原理-落樱之剑实例图文详细剖析(JME3,JMonkeyEngine游戏开发)...
- 什么是SQL注入式攻击!如何防范SQL注入式攻击?
- SQL数据库字段数据类型说明
- Ubuntu ROS 安装
- TeamViewer远程连接群辉
- iOS 讯飞语音之语音听写 录音的实现
- Difference of PMP,IPMP,ITPMP,CPMP