### 洛谷P1402 题目链接 ###

题目大意:有 n 个人, p 间房间,q 种食物。每个人喜欢一些房间,一些食物,但每间房间、每种食物只能分配给一个人。问最大可以让多少个人满足(当且仅当分配到的房间和食物都是自己喜欢的)。

分析:

1、房间与食物只能被分配一次,被分配后不能再被利用。想到二分图匹配问题。

2、再看题干发现,此题不能直接二分图匹配。因为还需要每个人本身也只能被利用一次。比如某个人喜欢的房间是 1 2 ,食物是 3 4 ,那么即便有 1 - 2 、3 - 4 两种匹配,但也只能满足这一个人,并不是满足了两个人的分配问题。

3、综上,即要保证房间和食物的“流量”最大为1,还需要保证人的“流量”最大为 1 。故可以将房间连接于起点 S ,食物连接于终点 T ,容量为 1 。

按样例来看,图应该为这样:

这样保证了房间和食物只能被用一次,但这建图还是错的。。。因为不能保证 人(点3、点4)的流量最大是 1 。比如:

加了这条红色的边后,点3 这个人的最大流量为 2 (从房间 1 和房间 2 流入。且流出于食物 5 和食物 6 ),与题干不符,所以需要把每个人拆成两点,然后中间连一条边,这样就可以限制人的流入与流出了。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#define maxn 408
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
queue<int> Q;
int n,p,q,cnt,S,T;
int head[maxn],cur[maxn],d[maxn];
struct Edge{
int to;
int val;
int next;
}edge[maxn*maxn];
inline void add(int u,int v,int w){
edge[++cnt].to=v;
edge[cnt].val=w;
edge[cnt].next=head[u];
head[u]=cnt;
return;
}
bool bfs(){
while(!Q.empty()) Q.pop();
memset(d,-,sizeof(d));
d[S]=;
Q.push(S);
while(!Q.empty()){
int u=Q.front();
Q.pop();
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(d[v]==-&&edge[i].val>){
d[v]=d[u]+;
Q.push(v);
}
}
}
return d[T]!=-;
}
int dfs(int u,int flow){
int nowflow=;
if(u==T) return flow;
for(int i=cur[u];~i;i=edge[i].next){
cur[u]=i;
int v=edge[i].to;
if(d[v]==d[u]+&&edge[i].val>){
if(int k=dfs(v,min(flow-nowflow,edge[i].val))){
edge[i].val-=k;
edge[i^].val+=k;
nowflow+=k;
if(nowflow==flow) break;
}
}
}
if(!nowflow) d[u]=-;
return nowflow;
}
int Dinic(){
int ans=;
while(bfs()){
for(int i=;i<=T;i++) cur[i]=head[i];
ans+=dfs(S,inf);
}
return ans;
}
int main()
{
scanf("%d%d%d",&n,&p,&q);
int A;
cnt=-;
memset(head,-,sizeof(head));
S=,T=*n+p+q+;
for(int i=;i<=p;i++) add(S,i,),add(i,S,);
for(int i=;i<=q;i++) add(p+*n+i,T,),add(T,p+*n+i,);
for(int i=;i<=n;i++){
for(int j=;j<=p;j++){
scanf("%d",&A);
if(A) add(j,p+i,),add(p+i,j,);
}
add(p+i,p+n+i,),add(p+n+i,p+i,);
}
for(int i=;i<=n;i++){
for(int j=;j<=q;j++){
scanf("%d",&A);
if(A) add(p+n+i,p+*n+j,),add(p+*n+j,p+n+i,);
}
}
printf("%d\n",Dinic());
}

洛谷P1402 酒店之王(网络流)的更多相关文章

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

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

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

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

  3. 洛谷P1402 酒店之王

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

  4. 洛谷 [P1402] 酒店之王

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

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

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

  6. P1402 酒店之王 网络流

    大水题,我自己瞎做就做出来了,没啥说的,zz建图,就是板子. 题干: 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等, ...

  7. LUOGU P1402 酒店之王 (网络流)

    解题思路 应该比较显然得能看出这是个网络流,将$S$与房间连边,房间与人连边,人与菜连边,菜与汇点连边,边的流量均为1.但这样是错误的,因为有可能一个人跑过去2的流量,所以要将人拆点限流. #incl ...

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

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

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

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

随机推荐

  1. 开源堡垒机jumpserver的安装

    开源跳板机jumpserver安装 简介 Jumpserver 是全球首款完全开源的堡垒机, 使用GNU GPL v2.0 开源协议, 是符合4A 的专业运维审计系统 Jumpserver 使用Pyt ...

  2. 【转载】wav文件格式分析与详解

    WAV文件是在PC机平台上很常见的.最经典的多媒体音频文件,最早于1991年8月出现在Windows 3.1操作系统上,文件扩展名为WAV,是WaveFom的简写,也称为波形文件,可直接存储声音波形, ...

  3. Zookeeper分布式系统协同器概念快速学习

    原文格式可以访问:https://www.rockysky.tech 分布式系统的基本操作 主节点选举:在绝大多数分布式系统中,都需要进行主节点选举.主节点负责管理协调其它节点或者同步集群中其它节点的 ...

  4. WannaMine4.0查杀方法

    病毒现象 扫描爆破内网基于445端口的SMB服务 服务器出现卡顿.蓝屏 服务器主动访问恶意域名:totonm.com.cake.pilutce.com:443 病毒处置 删除关键病毒文件:C:\Win ...

  5. dotnetcore3.1 WPF 实现多语言

    dotnetcore3.1 WPF 实现多语言 Intro 最近把 DbTool 从 WinForm 迁移到了 WPF,并更新到了 dotnet core 3.1,并实现了基于 Microsoft.E ...

  6. R12客户表结构分析

    客户表/联系人/PARTY关联   HZ_PARTIES 客户账户表   HZ_CUST_ACCOUNTS 例子:    select hp.party_number --客户注册标识         ...

  7. iOS 开发技术栈与进阶

    最近有一些开发朋友问我应该怎样提升自己的能力,回想起来做了这么久 iOS 开发,我也有过那种“让我做一个功能实现个需求我会做,但接下来怎样提高我不知道.”的时期,这里尝试列一下 iOS 开发的相关技术 ...

  8. SpringBoot整合NoSql--(四)Session共享

    简介: 正常情况下,HttpSession是通过Servlet 容器创建并进行管理的,创建成功之后都是保存在内存中.如果开发者需要对项目进行横向扩展搭建集群,那么可以利用一些硬件或者软件工具来做负载均 ...

  9. css基本概念与css核心语法介绍

    css基本概念 css是什么?不需要了解太多文字类介绍,记住css是层叠样式表,HTML是页面结构,css负责页面样式,javascrt负责静态页面的交互.CSS 能够对网页中元素位置的排版进行像素级 ...

  10. linux---基础学习

    学习使用linux 偶然间看到一篇介绍linux的使用,于是看了看,整体看完,虽然看的有些懵✒,但还是坚持看完了基础部分,并做了一些摘要. man页面所属的分类标识 常用的是分类1和分类3 (1).用 ...