Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流)

Description

假设有来自n个不同单位的代表参加一次国际会议。每个单位的代表数分别为 ri。会议餐厅共有m张餐桌,每张餐桌可容纳 ci个代表就餐。

为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。

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

Input

文件第1行有2个正整数m和n,m表示单位数,n表示餐桌数。

文件第2行有m个正整数,分别表示每个单位的代表数。

文件第3行有n个正整数,分别表示每个餐桌的容量。

Output

如果问题有解,在文件第1行输出1,否则输出0。

接下来的m行给出每个单位代表的就餐桌号。如果有多个满足要求的方案,只要输出一个方案。

Sample Input

4 5

4 5 3 5

3 5 2 6 4

Sample Output

1

1 2 4 5

1 2 3 4 5

2 4 5

1 2 3 4 5

Http

Libre:https://loj.ac/problem/6004

Source

网络流,最大流

解决思路

我们建立一个源点和一个汇点,从源点连边到每一个单位,流量就为该单位的人数。从每一个桌子向汇点连边,流量就为该桌子可以坐下的人数。然后再在每一个单位和每一张桌子之间连边,每一条边的流量都为1,这是为了保证一个单位最多只有一个人坐在一张桌子上。

然后我们跑一边最大流。若最大流的流量等于所有单位人数之和,则说明有解,扫描所有单位连向桌子的边看看残量是否为0,若为0,说明该单位有一人坐到了该桌子,输出该桌子的编号。若最大流的流量小于所有单位人数之和,则说无解。

另:这里用Dinic算法实现最大流,具体可以移步笔者的Dinic算法研究总结

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std; const int maxN=1001;
const int maxM=maxN*maxN*4;
const int inf=2147483647; class Edge
{
public:
int u,v,flow;
}; int m,n;
int cnt=-1;
int Head[maxN];
int Next[maxM];
Edge E[maxM];
int depth[maxN];
int cur[maxN];
int Q[maxM]; void Add_Edge(int u,int v,int flow);
bool bfs();
int dfs(int u,int flow); int main()
{
int pepsum=0;
memset(Head,-1,sizeof(Head));
scanf("%d%d",&m,&n);
for (int i=1;i<=m;i++)//连接每一个单位与每一张桌子
for (int j=1;j<=n;j++)
Add_Edge(i,j+m,1);
for (int i=1;i<=m;i++)
{
int num;
scanf("%d",&num);//读入单位的人数,同时连接源点和单位
Add_Edge(0,i,num);
pepsum+=num;//累计总人数
}
for (int i=1;i<=n;i++)
{
int num;
scanf("%d",&num);//读入桌子的容量,同时连接桌子与汇点
Add_Edge(i+m,n+m+1,num);
}
int Ans=0;//Dinic求最大流
while (bfs())
{
for (int i=0;i<=n+m+1;i++)
cur[i]=Head[i];
while (int di=dfs(0,inf))
Ans+=di;
}
//cout<<Ans<<endl;
if (Ans<pepsum)//若最大流小于人数,则无解
{
cout<<0<<endl;
return 0;
}
cout<<1<<endl;//否则说明有解,输出解
for (int i=1;i<=m;i++)
{
for (int j=Head[i];j!=-1;j=Next[j])
if ((E[j].v>=m+1)&&(E[j].v<=n+m)&&(E[j].flow==0))
cout<<E[j].v-m<<" ";
cout<<endl;
}
return 0;
} void Add_Edge(int u,int v,int flow)
{
cnt++;
Next[cnt]=Head[u];
Head[u]=cnt;
E[cnt].u=u;
E[cnt].v=v;
E[cnt].flow=flow; cnt++;
Next[cnt]=Head[v];
Head[v]=cnt;
E[cnt].u=v;
E[cnt].v=u;
E[cnt].flow=0;
} bool bfs()
{
memset(depth,-1,sizeof(depth));
int h=1,t=0;
Q[1]=0;
depth[0]=1;
do
{
t++;
int u=Q[t];
for (int i=Head[u];i!=-1;i=Next[i])
{
int v=E[i].v;
if ((depth[v]==-1)&&(E[i].flow>0))
{
depth[v]=depth[u]+1;
h++;
Q[h]=v;
}
}
}
while (h!=t);
if (depth[n+m+1]==-1)
return 0;
return 1;
} int dfs(int u,int flow)
{
if (u==n+m+1)
return flow;
for (int & i=cur[u];i!=-1;i=Next[i])
{
int v=E[i].v;
if ((depth[v]==depth[u]+1)&&(E[i].flow>0))
{
int di=dfs(v,min(flow,E[i].flow));
if (di>0)
{
E[i].flow-=di;
E[i^1].flow+=di;
return di;
}
}
}
return 0;
}

Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流)的更多相关文章

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

    #6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...

  2. 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐

    题目描述 假设有来自 \(n\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i\) .会议餐厅共有 \(m\) 张餐桌,每张餐桌可容纳 \(c_i\)​​ 个代表就餐. 为了使 ...

  3. [cogs729] [网络流24题#5] 圆桌聚餐 [网络流,最大流,多重二分图匹配]

    建图:从源点向单位连边,边权为单位人数,从单位向圆桌连边,边权为1,从圆桌向汇点连边,边权为圆桌容量. #include <iostream> #include <algorithm ...

  4. 【PowerOJ1740&网络流24题】圆桌聚餐(最大流)

    题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...

  5. Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

    Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...

  6. Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)

    Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...

  7. LIbreOJ #6011. 「网络流 24 题」运输问题 最小费用最大流

    #6011. 「网络流 24 题」运输问题 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  8. liberOJ#6006. 「网络流 24 题」试题库 网络流, 输出方案

    #6006. 「网络流 24 题」试题库     题目描述 假设一个试题库中有 n nn 道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取 m mm 道题组成试卷.并要求 ...

  9. 2018.10.14 loj#6003. 「网络流 24 题」魔术球(最大流)

    传送门 网络流好题. 这道题可以动态建图. 不难想到把每个球iii都拆点成i1i_1i1​和i2i_2i2​,每次连边(s,i1),(i2,t)(s,i_1),(i_2,t)(s,i1​),(i2​, ...

随机推荐

  1. python变量名感悟

    我感悟的是python的变量名其实就可以理解为C/C++中的指针! 1.python的变量在使用之前必须赋值,就像指针在使用之前不能为空. 2.python的内存可以用del释放,C++可以用dele ...

  2. LoRa---射频信号接收框架简图介绍

    LoRa整体框架图如下: 内容下次再填! 内容补上: 射频信号的接收流程(小博并非专业,错了emmmmm轻喷):射频--->中频--->基带,下面按照图中标的序号开始介绍: 1.天线接受射 ...

  3. phabricator 结合 arcanist 使用

    简介 arcanist 是 phabricator 接口的命令工具,主要用于提交 diff 和 push review 通过的commit. 安装 下载源码,然后指定系统的环境变量即可 $ some_ ...

  4. Redis介绍及Jedis基础操作

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

  5. Linux 僵尸进程

    Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...

  6. Arcengine效率探究之二——属性的更新(转载)

    http://blog.csdn.net/lk103852503/article/details/6570748 修改一批要素的属性有多种方法,当数据量较大时,若选择不当可能会大大影响速度. 一.IR ...

  7. 如何解决python连接数据库编码问题(python传数据到mysql乱码)'ascii' codec can't encode _mysql_exceptions.OperationalError: (1366, "Incorrect string value:?

    首先描述下问题:  在使用python计算出结果后将结果插入到mysql过程中,报如下错误.原因很好定位就是编码的问题.那么到底是编码哪里出了问题了呢? 报错如上: 排查顺序: 第一:python的编 ...

  8. 11.10 Daily Scrum

    工作进度有点拖后,之后几天要加快步伐了.   Today's tasks  Next week 丁辛 餐厅列表UI设计 餐厅列表事件处理             李承晗             实现指 ...

  9. wordpress学习三:wordpress自带的模板学习

    在<学习二>里,大概说了下怎么去查找模板,本节我们以一个简单的模板为例子,继续说说wordpress的模板机制,看看做一个自己的模板需要哪些知识点. 页面模板渲染 wordpress的模板 ...

  10. C语言版本:双链表的实现

    Dlist.h #ifndef __DLIST_H__ #define __DLIST_H__ #include<cstdio> #include<malloc.h> #inc ...