【网络流24题】圆桌聚餐(最大流)

【网络流24题】圆桌聚餐(最大流)

题面

Cogs

题解

这道题很简单
首先每个单位的人数限制
直接从源点向单位连边,容量为人数
同样的,
每个桌子向汇点连边,容量为可以坐的人数
因为每个桌子只能够做一个该单位的人
所以,每个单位向桌子连边,容量为1

然后跑一边最大流求方案就行了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define MAXL 500000
#define MAX 50000
#define INF 1000000000
inline int read()
{
    int x=0,t=1;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    if(ch=='-')t=-1,ch=getchar();
    while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    return x*t;
}
struct Line
{
    int v,next,w;
}e[MAXL];
int h[MAX],cnt;
int S,T,n,m;
inline void Add(int u,int v,int w)
{
    e[cnt]=(Line){v,h[u],w};h[u]=cnt++;
    e[cnt]=(Line){u,h[v],0};h[v]=cnt++;
}
int level[MAX];
bool BFS()
{
    memset(level,0,sizeof(level));
    level[S]=1;
    queue<int> Q;
    Q.push(S);
    while(!Q.empty())
    {
        int u=Q.front();Q.pop();
        for(int i=h[u];i!=-1;i=e[i].next)
        {
            int v=e[i].v;
            if(e[i].w&&!level[v])
                level[v]=level[u]+1,Q.push(v);
        }
    }
    return level[T];
}
int DFS(int u,int flow)
{
    if(flow==0||u==T)return flow;
    int ret=0;
    for(int i=h[u];i!=-1;i=e[i].next)
    {
        int v=e[i].v;
        if(e[i].w&&level[v]==level[u]+1)
        {
            int dd=DFS(v,min(flow,e[i].w));
            flow-=dd;ret+=dd;
            e[i].w-=dd;e[i^1].w+=dd;
        }
    }
    return ret;
}
int Dinic()
{
    int ret=0;
    while(BFS())ret+=DFS(S,INF);
    return ret;
}
int sum;
int main()
{
    freopen("roundtable.in","r",stdin);
    freopen("roundtable.out","w",stdout);
    memset(h,-1,sizeof(h));
    m=read();n=read();
    S=0;T=n+m+1;
    for(int i=1;i<=m;++i){int x=read();Add(S,i,x);sum+=x;};
    for(int i=1;i<=n;++i)Add(i+m,T,read());
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
            Add(i,j+m,1);
    if(Dinic()!=sum){puts("0");return 0;}
    puts("1");
    for(int i=1;i<=m;++i)
    {
        for(int j=h[i];j!=-1;j=e[j].next)
        {
            int v=e[j].v;
            if(v>m&&!e[j].w)printf("%d ",v-m);
        }
        puts("");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/cjyyb/p/8191185.html

时间: 2024-10-09 01:52:24

【网络流24题】圆桌聚餐(最大流)的相关文章

[网络流24题] 圆桌聚餐

729. [网络流24题] 圆桌聚餐 ★★   输入文件:roundtable.in   输出文件:roundtable.out   评测插件 时间限制:1 s   内存限制:128 MB   «问题描述: 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri(i=1,2,3...m), .会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐. 为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐.试设计一个算法, 给出满足要求的代表就

[洛谷P3254] [网络流24题] 圆桌游戏

Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n)个代表就餐. 为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐.试设计一个算法,给出满足要求的代表就餐方案. 对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案. Input 第1 行有2 个正整数m 和n,m 表示单位数,n 表示餐桌数,1<=m<=150, 1

[网络流24题]圆桌问题

Description 假设有来自$n$个不同单位的代表参加一次国际会议.每个单位的代表数分别为$r_i(i\;\in\;[1,n])$.会议餐厅共有$m$张餐桌,每张餐桌可容纳$c_i(i\;\in\;[1,m])$个代表就餐.为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐.求满足要求的代表就餐方案. Input 第$1$行有$2$个正整数$m,n.m$表示单位数,$n$表示餐桌数. 第$2$行有$m$个正整数,分别表示每个单位的代表数. 文件第$3$行有$n$个正整数,分别

网络流24题-运输问题(费用流)

题目描述 WW 公司有 mm 个仓库和 nn 个零售商店.第 ii 个仓库有 a_iai? 个单位的货物:第 jj 个零售商店需要 b_jbj? 个单位的货物. 货物供需平衡,即\sum\limits_{i=1}^{m}a_i=\sum\limits_{j=1}^{n}b_ji=1∑m?ai?=j=1∑n?bj?. 从第 ii 个仓库运送每单位货物到第 jj 个零售商店的费用为 c_{ij}cij??? . 试设计一个将仓库中所有货物运送到零售商店的运输方案,使总运输费用最少. 输入输出格式 输

餐巾计划问题 【网络流24题】【费用流】【zkw】

题目描述 一个餐厅在相继的 NN 天里,每天需用的餐巾数不尽相同.假设第 ii 天需要 r_iri?块餐巾( i=1,2,...,N).餐厅可以购买新的餐巾,每块餐巾的费用为 pp 分;或者把旧餐巾送到快洗部,洗一块需 m 天,其费用为 f 分;或者送到慢洗部,洗一块需 nn 天(n>mn>m),其费用为 ss 分(s<fs<f). 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.但是每天洗好的餐巾和购买的新餐巾数之和,要满足当

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

#6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有来自 n nn 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri r_ir?i??.会议餐厅共有 m mm 张餐桌,每张餐桌可容纳 ci c_ic?i?? 个代表就餐.为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐. 试设计一个算法,给出满足要求的

【网络流24题】圆桌聚餐

LOJ 6004 [网络流24题]圆桌聚餐 题面 假设有来自\(n\)个不同单位的代表参加一次国际会议.每个单位的代表数分别为\(r_i\).会议餐厅共有\(m\)张餐桌,每张餐桌可容纳\(c_i\)个代表就餐. 为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐. 试设计一个算法,给出满足要求的代表就餐方案. 题解 源点向每个单位连一条边,边权是该单位人数: 每个单位向各个餐桌连一条边,边权是1: 每个餐桌向汇点连一条边,边权是餐桌容纳人数. 如果最大流 < 总人数,则无解.若有

「网络流24题」 5. 圆桌问题

「网络流24题」 5. 圆桌问题 <题目链接> 二分图多重匹配. 多对多. 匈牙利似乎真的不太好办了. 所以乖乖最大流吧. 套路建模,S->每个单位(边权=单位代表数):每个餐桌->T(边权=餐桌容量):每个单位->每个餐桌(边权=1). 跑最大流. 最大流等于总代表数则有解,否则无解. 每个单位的出边中,每条满流边的终点便是这一单位每个代表的餐桌号. #include <algorithm> #include <climits> #include &

734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

?问题描述:在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.?编程任务:对于给定的方格棋盘,按照取数要求编程找出总和最大的数.?数据输入:由文件grid.in提供输入数据.文件第1 行有2 个正整数m和n,分别表示棋盘的行数和列数.接下来的m行,每行有n个正整数,表示棋盘方格中的数. [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白