• LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题


    #6004. 「网络流 24 题」圆桌聚餐

    内存限制:256 MiB时间限制:5000 ms标准输入输出
    题目类型:传统评测方式:Special Judge
    上传者: 匿名

    题目描述

    假设有来自 n nn 个不同单位的代表参加一次国际会议。每个单位的代表数分别为 ri r_iri​​。会议餐厅共有 m mm 张餐桌,每张餐桌可容纳 ci c_ici​​ 个代表就餐。
    为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。

    试设计一个算法,给出满足要求的代表就餐方案。

    输入格式

    文件第 1 11 行有 2 22 个正整数 m mm 和 n nn,m mm 表示单位数,n nn 表示餐桌数。
    文件第 2 22 行有 m mm 个正整数,分别表示每个单位的代表数。
    文件第 3 33 行有 n nn 个正整数,分别表示每个餐桌的容量。

    输出格式

    如果问题有解,在文件第 1 11 行输出 1 11,否则输出 0 00。
    接下来的 m mm 行给出每个单位代表的就餐桌号。如果有多个满足要求的方案,只要输出一个方案。

    样例

    样例输入

    4 5
    4 5 3 5
    3 5 2 6 4

    样例输出

    1
    1 2 4 5
    1 2 3 4 5
    2 4 5
    1 2 3 4 5

    数据范围与提示

    1≤m≤150,1≤n≤270 1 leq m leq 150, 1 leq n leq 2701m150,1n270

    题目链接:https://loj.ac/problem/6004

    思路:最大流板子题

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> P;
    #define PI acos(-1.0)
    const int maxn=500,maxm=1e5+100,inf=0x3f3f3f3f,mod=1e9+7;
    const ll INF=1e18+7;
    struct edge
    {
        int from,to,cap,flow;
    };
    vector<edge>es;
    vector<int>G[maxn];
    bool vis[maxn];
    int dist[maxn];
    int iter[maxn];
    void init(int n)
    {
        for(int i=0; i<=n+10; i++) G[i].clear();
        es.clear();
    }
    void addedge(int from,int to,int cap)
    {
        es.push_back((edge)
        {
            from,to,cap,0
        });
        es.push_back((edge)
        {
            to,from,0,0
        });
        int x=es.size();
        G[from].push_back(x-2);
        G[to].push_back(x-1);
    }
    bool BFS(int s,int t)
    {
        memset(vis,0,sizeof(vis));
        queue <int> Q;
        vis[s]=1;
        dist[s]=0;
        Q.push(s);
        while(!Q.empty())
        {
            int u=Q.front();
            Q.pop();
            for (int i=0; i<G[u].size(); i++)
            {
                edge &e=es[G[u][i]];
                if (!vis[e.to]&&e.cap>e.flow)
                {
                    vis[e.to]=1;
                    dist[e.to]=dist[u]+1;
                    Q.push(e.to);
                }
            }
        }
        return vis[t];
    }
    int DFS(int u,int t,int f)
    {
        if(u==t||f==0) return f;
        int flow=0,d;
        for(int &i=iter[u]; i<G[u].size(); i++)
        {
            edge &e=es[G[u][i]];
            if(dist[u]+1==dist[e.to]&&(d=DFS(e.to,t,min(f,e.cap-e.flow)))>0)
            {
                e.flow+=d;
                es[G[u][i]^1].flow-=d;
                flow+=d;
                f-=d;
                if (f==0) break;
            }
        }
        return flow;
    }
    int Maxflow(int s,int t)
    {
        int flow=0;
        while(BFS(s,t))
        {
            memset(iter,0,sizeof(iter));
            int d=0;
            while(d=DFS(s,t,inf)) flow+=d;
        }
        return flow;
    }
    int a[maxn],b[maxn];
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int s=0,t=n+m+1;
        init(n+m+10);
        int sum=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=m; j++)
                addedge(i,j+n,1);
        }
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
            addedge(s,i,a[i]);
        }
        for(int i=1; i<=m; i++)
        {
            scanf("%d",&b[i]);
            addedge(i+n,t,b[i]);
        }
        if(Maxflow(s,t)<sum) printf("0
    ");
        else
        {
            printf("1
    ");
            for(int i=0; i<n*m*2; i+=2)
            {
                if(es[i].flow>0) printf("%d ",es[i].to-n);
                if(es[i].to-n==m) printf("
    ");
            }
        }
        return 0;
    }
    最大流版子题
  • 相关阅读:
    php字符串练习题
    连接数据库报错的异常可以用mysqli_report来捕获
    nginx配置phpfpm虚拟主机站点
    php yield使用
    mysql8可以创建虚拟列作为公式映射字段
    【简记】Linux界面连接WPA2Enterprise Wifi
    云平台将故障Pod流量下线通用思路与OpenShift操作实战
    清空当前连接的Oracle数据库
    CAS学习笔记四:CAS单点登出流程
    【简记】SpringBoot禁用Swagger
  • 原文地址:https://www.cnblogs.com/GeekZRF/p/7353048.html
Copyright © 2020-2023  润新知