LG1402 酒店之王
题意
XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化。由于很多来住店的旅客有自己喜好的房间色调、阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜。
有一天来了n个客人,每个客人说出了自己喜欢哪些房间,喜欢哪道菜。但是很不幸,可能做不到让所有顾客满意(满意的条件是住进喜欢的房间,吃到喜欢的菜)。
这里要怎么分配,能使最多顾客满意呢?
\(n,p,q \leq 100\)
分析
将人拆成两个点,中间加一条容量为1的边。
然后源点连房间,房间连人,人连菜,菜连汇点,跑最大流就行了。
时间复杂度\(O(n^4)\)
代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<set>
#include<map>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
template<class T>T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
{
data=data*10+ch-'0';
ch=getchar();
}
return x=data*w;
}
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=407,MAXM=5e4+7;
int n,p,q; // people,room,meal
struct edge
{
int nx,to,c;
}e[MAXM];
int head[MAXN],ecnt;
void addedge(int x,int y,int c)
{
e[++ecnt].to=y,e[ecnt].c=c;
e[ecnt].nx=head[x],head[x]=ecnt;
}
int dep[MAXN],cur[MAXN];
queue <int> Q;
bool bfs(int s,int t)
{
copy(head,head+t+1,cur);
fill(dep+s,dep+t+1,INF);
dep[s]=0;
Q.push(s);
while(Q.size())
{
int x=Q.front();
Q.pop();
for(int i=head[x];i!=-1;i=e[i].nx)
{
int y=e[i].to,c=e[i].c;
if(c>0&&dep[y]==INF)
{
dep[y]=dep[x]+1;
Q.push(y);
}
}
}
return dep[t]<INF;
}
int dfs(int x,int t,int lim)
{
if(x==t||!lim)
return lim;
int delta=0,inc;
for(int i=cur[x];i!=-1;i=e[i].nx)
{
cur[x]=i;
int y=e[i].to,c=e[i].c;
if(dep[y]==dep[x]+1&&(inc=dfs(y,t,min(lim,c))))
{
lim-=inc;
delta+=inc;
e[i].c-=inc;
e[i^1].c+=inc;
if(!lim)
break;
}
}
return delta;
}
int Dinic(int s,int t)
{
int res=0;
while(bfs(s,t))
res+=dfs(s,t,INF);
return res;
}
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
read(n);read(p);read(q);
fill(head,head+p+2*n+q+2,-1);
ecnt=-1;
for(int i=1;i<=p;++i)
{
addedge(0,i,1);
addedge(i,0,0);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=p;++j)
{
int opt;
read(opt);
if(opt)
{
addedge(j,p+i,1);
addedge(p+i,j,0);
}
}
for(int i=1;i<=n;++i)
{
addedge(p+i,p+n+i,1);
addedge(p+n+i,p+i,0);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=q;++j)
{
int opt;
read(opt);
if(opt)
{
addedge(p+n+i,p+2*n+j,1);
addedge(p+2*n+j,p+n+i,0);
}
}
for(int i=1;i<=q;++i)
{
addedge(p+2*n+i,p+2*n+q+1,1);
addedge(p+2*n+q+1,p+2*n+i,0);
}
int ans=Dinic(0,p+2*n+q+1);
printf("%d\n",ans);
return 0;
}
LG1402 酒店之王的更多相关文章
- Luogu 1402 酒店之王(二分图最大匹配)
Luogu 1402 酒店之王(二分图最大匹配) Description XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自 ...
- 洛谷P2891 Dining P1402 酒店之王【类二分图匹配】题解+代码
洛谷P2891 Dining P1402 酒店之王[类二分图匹配]题解+代码 酒店之王 题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的 ...
- luogu1402 酒店之王
题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...
- [Luogu 1402] 酒店之王
题目 Description XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有 ...
- [luogu1402]酒店之王_网络流
酒店之王 luogu-1402 题目大意:有n个人,p道菜,q个房间,每个人喜欢吃一些菜.喜欢住一些房间,如果一个人即住到了他喜欢的房间有吃到了他喜欢的菜,就对答案贡献++,求最大贡献. 注释:1&l ...
- P1402 酒店之王
P1402 酒店之王 每个人要匹配一个A和一个B,所以这样连边: S向每个房间连边. 每个房间向喜欢这个房间的人连边. 每个人向喜欢的菜连边. 每道菜向T连边. 边权均为1. 注意人要限流. // I ...
- 【刷题】洛谷 P1402 酒店之王
题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...
- P1402 酒店之王 最大流
\(\color{#0066ff}{ 题目描述 }\) XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该 ...
- luogu P1402 酒店之王
题目描述 XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自己所爱的菜,但是该酒店只有p间房间,一天只有固定的q道不同的菜. ...
随机推荐
- jquery中的工具方法$.isFunction, $.isArray(), $.isWindow()
本文正式地址:http://www.xiabingbao.com/jquery/2015/07/25/jquery-judge-type 在javascript中对变量类型的判断中,我们讲解了了jqu ...
- mysql数据库建表
主键的问题: 简单的id递加.不过在实习的时候,因为id递增的问题,导致一个项目最后好像产生了严重的问题.所以递增适合小型项目,对我们的项目来说90%足够可以用的. 一些限制: 一般就非空就行,唯一的 ...
- spring mvc:内部资源视图解析器2(注解实现)@Controller/@RequestMapping
spring mvc:内部资源视图解析器2(注解实现) @Controller/@RequestMapping 访问地址: http://localhost:8080/guga2/hello/goo ...
- web常见问题排查
原帖地址:http://mp.weixin.qq.com/s?__biz=MjM5NzUwNDA5MA==&mid=200596752&idx=1&sn=37ecae802f3 ...
- SPOJ-394-ACODE - Alphacode / dp
ACODE - Alphacode #dynamic-programming Alice and Bob need to send secret messages to each other and ...
- 【转】 JavaScript:history.go() 的妙用(转) 处理post回发后返回
在Web开发中,会遇到从一页(父页)导向另一页(子页),并且要求“返回”父页的情况,在这里如果用ASP.NET提供的 Response.Redirect()方法,往往不会达到理想的效果,例如:返回后, ...
- Day16 Django深入讲解
参考博客: http://www.cnblogs.com/yuanchenqi/articles/6083427.html http://www.cnblogs.com/yuanchenqi/arti ...
- 二十四、DBMS_SQL
1.概述 1) 在整个程序的设计过程中,对游标的操作切不可有省略的部分,一旦省略其中某一步骤,则会程序编译过程既告失败,如在程序结尾处未对改游标进行关闭操作,则在再次调用过程时会出现错误. 2) db ...
- eureka-4-eureka server 高可用
Eureka Server 可以通过运行多个实例并相互注册实现高可用部署.Eureka Server 实例之间会彼此增量同步信息,确保所有节点信息一致. 关键点: 配置: eureka.client. ...
- LeetCode OJ:Palindrome Partitioning(回文排列)
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...