题意

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 酒店之王的更多相关文章

  1. Luogu 1402 酒店之王(二分图最大匹配)

    Luogu 1402 酒店之王(二分图最大匹配) Description XX酒店的老板想成为酒店之王,本着这种希望,第一步要将酒店变得人性化.由于很多来住店的旅客有自己喜好的房间色调.阳光等,也有自 ...

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

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

  3. luogu1402 酒店之王

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

  4. [Luogu 1402] 酒店之王

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

  5. [luogu1402]酒店之王_网络流

    酒店之王 luogu-1402 题目大意:有n个人,p道菜,q个房间,每个人喜欢吃一些菜.喜欢住一些房间,如果一个人即住到了他喜欢的房间有吃到了他喜欢的菜,就对答案贡献++,求最大贡献. 注释:1&l ...

  6. P1402 酒店之王

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

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

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

  8. P1402 酒店之王 最大流

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

  9. luogu P1402 酒店之王

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

随机推荐

  1. 关系型数据库(RDBMS)与 MongoDB 的对应关系

    谈一下关系型数据库(RDBMS)与 MongoDB 的对应关系:

  2. Kinect研究文档

    1.  Kinect主要脚本介绍 1.1  KinectManager脚本 控制传感器并轮询数据流, 下图是参数详解: 公共API网址:https://ratemt.com/k2gpapi/annot ...

  3. LR--实现HTTP协议的接口测试

    场景分析:使用LR完成HTTP协议的接口测试 流程: 1.首先需要找一个接口(POST.GET接口) 2.LR中点击Insert-->New Step-->web_custom_reque ...

  4. UVA-1611 Crane (构造)

    题目大意:给一个1~n的序列,每次操作可以把长度为偶数的序列交换前一半和后一半的位置.求出将这个序列变成升序的步骤. 题目分析:构造求解. 代码如下: # include<iostream> ...

  5. CodeForces 297C Splitting the Uniqueness (脑补构造题)

    题意 Split a unique array into two almost unique arrays. unique arrays指数组各个数均不相同,almost unique arrays指 ...

  6. day19 Models补充+缓存+信号+序列化+分析抽屉页面

    参考链接: http://www.cnblogs.com/wupeiqi/articles/5237704.html http://www.cnblogs.com/wupeiqi/articles/5 ...

  7. linux oracle11g 数据 导入到10g数据库

    说明: 原用户名和密码:test/test  目标用户名和密码:test01/test 11G 服务器: 1.创建dmp文件存储目录 # mkdir -p /tmp/backup # sqlplus ...

  8. 2: 使用Prism初始化程序(纯汉语版)

    本篇内容讲解了Prism应用程序启动和运行都发生了什么.一个Pris应用程序在程序启动期间需要注册和配置——这被叫做引导应用程序.Prism引导过程包括创建和配置一个模块目录,创建一个例如Unity的 ...

  9. c#批量上传图片到服务器示例分享

    这篇文章主要介绍了c#批量上传图片到服务器示例,服务器端需要设置图片存储的虚拟目录,需要的朋友可以参考下 /// <summary> /// 批量上传图片 /// </summary ...

  10. 自研发RPC调用框架

    自主研发设计RPC远程调用框架,实现服务自动注册,服务发现,远程RPC调用,后续实现服务负载均衡 主要包括:客户端服务,服务端,服务发现,服务注册 github地址:https://github.co ...