题意

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. virtual dom & mvvm

    虚拟dom 用js对象来表示dom树的结构,然后用这个对象来构建一个真正的dom树插入文档中: 当状态有变时,重新构造一个新的对象树,然后比较新的和旧的树,记录两个数的差异: 把差异部分应用到真正的d ...

  2. spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器)

    spring mvc: 多解析器映射(资源绑定视图解析器 + 内部资源[普通模式/]视图解析器) 资源绑定视图解析器 + 内部资源(普通模式)视图解析器 并存方式 内部资源视图解析器: http:// ...

  3. hdu4305生成树计数

    先预处理出距离,然后判断是否可行,要注意判断是否在一条直线上时判断是在两侧还是一边(wa了四次) double型数据 #include<map> #include<set> # ...

  4. 【转】c++析构函数(Destructor)

    创建对象时系统会自动调用构造函数进行初始化工作,同样,销毁对象时系统也会自动调用一个函数来进行清理工作,例如释放分配的内存.关闭打开的文件等,这个函数就是析构函数. 析构函数(Destructor)也 ...

  5. yii2高级模板安装

    通过 Composer 安装 如果还没有安装 Composer,在 Linux 和 Mac OS X 中可以运行如下命令: curl -sS https://getcomposer.org/insta ...

  6. Mac下新安装的MySQL无法登陆root用户解决方法

      一 设置MySQL命令行搜索路径 0.苹果->系统偏好设置->最下边点mysql 在弹出页面中 启动mysql服务 1.打开终端,输入: sudo vi ~/.bash_profile ...

  7. 由浅入深了解EventBus:(四)

    事件注册 在EventBus3.0框架中订阅者对事件进行注册/订阅是通过EventBus类中的register方法来实现的,register的方法参数就是我们的订阅者的实例; public void ...

  8. WebApplication和WebSite的简单区别

    初步认识网站和网站应用程序区别 1. 网页头部文件 网站 <%@ Page Language="VB" AutoEventWireup="false" C ...

  9. 基于IDEA和Maven的SSM分层项目搭建

    前言 虽然现在SpringBoot开始流行,但是SSM作为一个经典框架,还是有必要去了解一下. 项目建立 1.新建一个空白的Maven项目,如下图.然后把IDEA自动生成的多余src目录删掉. 2.右 ...

  10. zoj1654

    题解: 对于每一联通的x,y 检点 然后交叉的连边 然后二分图 代码: #include<cstdio> #include<cstring> #include<cmath ...