题目大意:有三个集合 \(P,Q,N\),P 与 N 集合之间存在一些有向边,N 与 Q 集合之间存在一些有向边。在三个集合中每个点最多只能利用一次的前提下,求最多能利用多少N 集合中的点,使得 \((p,n,q)\) 三个节点之间均有边相连。

题解:若只有两个集合,显然是二分图的最大匹配问题。对于三个集合来说,最麻烦的问题在于 N 集合中每个点只能被选一次,但是一个 N 集合中的节点却可能对应着多个P、Q 集合中的节点。保证 N 只能被选一次的方法是:将 N 集合中的点拆分成两个点,分别表示入点和出点,且连接入点和出点之间的边权为 1。

代码如下

#include <bits/stdc++.h>
using namespace std;
const int maxn=410;
const int maxm=1e5+10; int n,p,q,s,t,maxflow,d[maxn];
struct node{int nxt,to,w;}e[maxm<<1];
int tot=1,head[maxn];
inline void add_edge(int from,int to,int w){
e[++tot]=node{head[from],to,w},head[from]=tot;
e[++tot]=node{head[to],from,0},head[to]=tot;
} bool bfs(){
queue<int> q;
memset(d,0,sizeof(d));
d[s]=1,q.push(s);
while(q.size()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(w&&!d[v]){
d[v]=d[u]+1;
q.push(v);
if(v==t)return 1;
}
}
}
return 0;
}
int dinic(int u,int flow){
if(u==t)return flow;
int rest=flow;
for(int i=head[u];i&&rest;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(w&&d[v]==d[u]+1){
int k=dinic(v,min(flow,w));
if(!k)d[v]=0;
e[i].w-=k,e[i^1].w+=k,rest-=k;
}
}
return flow-rest;
} void read_and_parse(){
scanf("%d%d%d",&n,&p,&q);
s=0,t=2*n+p+q+1;
for(int i=1;i<=n;i++)add_edge(i,i+n,1);
for(int i=1;i<=n;i++)
for(int j=1;j<=p;j++){
int x;scanf("%d",&x);
if(x)add_edge(j+2*n,i,1);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=q;j++){
int x;scanf("%d",&x);
if(x)add_edge(i+n,2*n+p+j,1);
}
for(int i=2*n+1;i<=2*n+p;i++)add_edge(s,i,1);
for(int i=2*n+p+1;i<=2*n+p+q;i++)add_edge(i,t,1);
}
void solve(){
int now;
while(bfs())while(now=dinic(s,0x3f3f3f3f))maxflow+=now;
printf("%d\n",maxflow);
}
int main(){
read_and_parse();
solve();
return 0;
}

【洛谷P1402】酒店之王的更多相关文章

  1. 洛谷P1402 酒店之王(二分图)

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

  2. 洛谷P1402 酒店之王(网络流)

    ### 洛谷P1402 题目链接 ### 题目大意:有 n 个人, p 间房间,q 种食物.每个人喜欢一些房间,一些食物,但每间房间.每种食物只能分配给一个人.问最大可以让多少个人满足(当且仅当分配到 ...

  3. 【刷题】洛谷 P1402 酒店之王

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

  4. 洛谷P1402 酒店之王

    传送门:>Here< 题意:有N个人去酒店,酒店共有P个房间,Q道菜.已知每个人喜欢特定的几个房间和几道菜,一个人是满意的当且仅当住了喜欢的房间,吃了喜欢的菜(一个人只能选一个房间一道菜) ...

  5. 洛谷 [P1402] 酒店之王

    有两个约束条件的二分图匹配 我们回忆一下二分图匹配的匈牙利算法的具体流程,它是通过寻找增广路来判断最大匹配数的,我们再观察一下题目中的两个条件,只有两个条件都满足,才算找到一条增广路,所以我们可以分别 ...

  6. 2018.08.19 洛谷P1402 酒店之王(最大流)

    传送门 最大流入门题,把人拆点即可. 代码: #include<bits/stdc++.h> #define N 505 using namespace std; inline int r ...

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

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

  8. 「洛谷P1402」酒店之王 解题报告

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

  9. P1402 酒店之王

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

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

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

随机推荐

  1. DevOps概述

    Devops概念 转载自 devops实践-开篇感想 DevOps(英文Development和Operations的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序/软件工程).技术运营和 ...

  2. 零基础学Python--------第11章 使用Python操作数据库

    第11章 使用Python操作数据库 11.1 数据库编程接口 在项目开发中,数据库应用必不可少.虽然数据库的种类有很多,如SQLite.MySQL.Oracle等,但是它们的功能基本都是一样的,为了 ...

  3. Spring笔记

    Spring概念 Spring是一个开源的轻量级的框架 Spring核心主要两部分 (1) Aop面向切面编程,扩展功能不是修改源代码实现 (2) Ioc控制反转, 比如说有一个类,在类里面有方法(不 ...

  4. github在README.md中插入图片

    例子 ![image](https://raw.githubusercontent.com/sunday123/Pendant/master/1.PNG)

  5. 记MVC学习过程中一次传参到View时遇到的错误

    在跟着 <PRO ASP.NET MVC5>一书进行第七章的练习的时候遇到了以上问题, 当遇到此类问题的时候应该先检查方法传输和其视图接受的数据类型是否一致, 大多时候都是因为两者数据类型 ...

  6. 自定义AXI总线形式SPI接口IP核,点亮OLED

    一.前言 最近花费很多精力在算法仿真和实现上,外设接口的调试略有生疏.本文以FPGA控制OLED中的SPI接口为例,重新夯实下基础.重点内容为SPI时序的RTL设计以及AXI-Lite总线分析.当然做 ...

  7. 初窥css---盒子以及盒子扩展

    盒子以及盒子扩展 盒子 盒子是用来实现将网页区域化的一个非常重要的工具,盒子使得网页各部分十分清晰的被分开,对于程序员十分友好(...),并且使得网页更加容易维护. 盒子的常用属性 宽和高这两个属性就 ...

  8. 28 Python初学(事件驱动模型)

    参考文章地址:http://www.cnblogs.com/yuanchenqi/articles/5722574.html 两个步骤: recvfrom 系统调用 : 拷贝数据 从kernel到数据 ...

  9. 我的Qt历程1:第一个Qt程序

    1.启动Qt,按照红圈内所标注顺序执行操作. 2.按下Choose键后,在“名称”栏目里给程序起名字(不要是汉字名字). 3.在“创建路径”栏目里指定程序将要使用的路径(不能用汉字路径). 4.在“类 ...

  10. Django Rest Framework(一)

    •基于Django 先创建一个django项目,在项目中创建一些表,用来测试rest framework的各种组件 class UserInfo(models.Model): "" ...