• P1402 酒店之王 网络流


      

    题目描述

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

    有一天来了n个客人,每个客人说出了自己喜欢哪些房间,喜欢哪道菜。但是很不幸,可能做不到让所有顾客满意(满意的条件是住进喜欢的房间,吃到喜欢的菜)。

    这里要怎么分配,能使最多顾客满意呢?

    输入输出格式

    输入格式:

    第一行给出三个正整数表示n,p,q(<=100)。

    之后n行,每行p个数包含0或1,第i个数表示喜不喜欢第i个房间(1表示喜欢,0表示不喜欢)。

    之后n行,每行q个数,表示喜不喜欢第i道菜。

    输出格式:

    最大的顾客满意数。

    输入输出样例

    输入样例#1: 复制
    2 2 2
    1 0
    1 0
    1 1
    1 1
    
    输出样例#1: 复制
    1


    注意要拆点 :

    食物放左边 人放中间 房间放右边 人与人之间拆点连1
    #include<bits/stdc++.h>
    using namespace std;
    //input by bxd
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);--i)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m)
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define pb push_back
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define inf 0x3f3f3f3f
    const int N=1e5+44;
    const int M=1e5+54;
    
    struct edge {
        int to, next, w;
    } e[M << 1];
    int head[N], cnt = 1;
    void add(int x, int y, int z) {
        e[++cnt] = (edge){y, head[x], z};
        head[x] = cnt;
        e[++cnt] = (edge){x, head[y], 0};
        head[y] = cnt;
    }
    int level[N];
    bool bfs(int s, int t) {
        memset(level, 0, sizeof level);
        queue<int> q;
        level[s] = 1;
        q.push(s);
        while (!q.empty()) {
            int pos = q.front();
            q.pop();
            for (int i = head[pos]; i; i = e[i].next) {
                int nx = e[i].to;
                if (!e[i].w || level[nx]) continue;
                level[nx] = level[pos] + 1;
                q.push(nx);
            }
        }
        return level[t];
    }
    int dfs(int s, int t, int flow) {
        if (s == t) return flow;
        int ret = 0;
        for (int i = head[s]; flow && i; i = e[i].next) {
            int nx = e[i].to;
            if (level[nx] == level[s] + 1 && e[i].w) {
                int tmp = dfs(nx, t, min(flow, e[i].w));
                e[i].w -= tmp;
                e[i ^ 1].w += tmp;
                flow -= tmp;
                ret += tmp;
            }
        }
        if (!ret) level[s] = 0;
        return ret;
    }
    int dinic(int s, int t) {
        int ret = 0;
        while (bfs(s, t)) ret += dfs(s, t, inf);
        return ret;
    }
    int n,m,s,t,p,q;
    
    int main()
    {
        RIII(n,p,q);
        s=2*n+q+p+1;
        t=s+1;
    
        rep(i,1,n)
        add(i,i+n,1);
    
        rep(i,1,n)
        rep(j,1,p)
        {
            int x;RI(x);
            if(x)add(j+2*n,i,1);
        }
        rep(i,1,n)
        rep(j,1,q)
        {
            int x;RI(x);
            if(x)add(i+n,j+2*n+p,1);
        }
    
        rep(i,1,p)add(s,i+2*n,1);
        rep(i,1,q)add(i+2*n+p,t,1);
    
        cout<<dinic(s,t);
    
        return 0;
    }
    View Code






  • 相关阅读:
    [C]%p和%02x含义
    [python]特殊输入格式(输入中包含空格逗号等)
    《python编程从入门到实践》用户输入和while循环
    [ C ]根据年月日判断周几(基姆拉尔森计算公式)
    《python编程从入门到实践》字典
    《python编程从入门到实践》if语句
    记一次页面乱码问题的解决
    apache配置健康检查
    nginx 配置代理对象的host
    nginx配置http负载均衡
  • 原文地址:https://www.cnblogs.com/bxd123/p/10931858.html
Copyright © 2020-2023  润新知