COGS729. [网络流24题] 圆桌聚餐
«问题描述:
假设有来自m 个不同单位的代表参加一次国际会议。每个单位的代表数分别为
ri(i=1,2,3...m), 。会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐。
为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,
给出满足要求的代表就餐方案。
«编程任务:
对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。
«数据输入:
由文件roundtable.in提供输入数据。文件第1行有2 个正整数m和n,m表示单位数,n表
示餐桌数,1<=m<=150, 1<=n<=270。文件第2 行有m个正整数,分别表示每个单位的代表
数。文件第3 行有n个正整数,分别表示每个餐桌的容量。
«结果输出:
程序运行结束时,将代表就餐方案输出到文件roundtable.out中。如果问题有解,在文件第
1 行输出1,否则输出0。接下来的m行给出每个单位代表的就餐桌号。如果有多个满足要
求的方案,只要输出1 个方案。
输入文件示例 输出文件示例
roundtable.in
- 4 5
- 4 5 3 5
- 3 5 2 6 4
roundtable.out
- 1
- 1 2 4 5
- 1 2 3 4 5
- 2 4 5
- 1 2 3 4 5
最大流问题。
源点S向所有的单位连边,容量为单位人数;
每个单位向所有的桌子连边,容量为1 (只能派一个人);
每个桌子向汇点T连边,容量为桌子可容纳人数;
跑最大流,如果可以满流,说明问题有解。
检查每一条边,记录每个单位派代表去了哪些桌子,最后输出答案。
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<queue>
- #include<vector>
- using namespace std;
- const int mxn=;
- int read(){
- int x=,f=;char ch=getchar();
- while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
- return x*f;
- }
- struct edge{
- int u,v,nxt,f;
- }e[mxn*];
- int hd[mxn],mct=;
- void add_edge(int u,int v,int f){
- e[++mct].v=v;e[mct].u=u;e[mct].f=f;e[mct].nxt=hd[u];hd[u]=mct;return;
- }
- int n,m;
- int S,T;
- int d[mxn];
- bool BFS(int s,int t){
- queue<int>q;
- memset(d,,sizeof d);
- d[s]=;
- q.push(s);
- while(!q.empty()){
- int u=q.front();q.pop();
- for(int i=hd[u];i;i=e[i].nxt){
- int v=e[i].v;
- if(!d[v] && e[i].f){
- d[v]=d[u]+;
- q.push(v);
- }
- }
- }
- return d[t];
- }
- int DFS(int u,int lim){
- if(u==T)return lim;
- int tmp,f=;
- for(int i=hd[u];i;i=e[i].nxt){
- int v=e[i].v;
- if(d[v]==d[u]+ && e[i].f){
- tmp=DFS(v,min(lim,e[i].f));
- e[i].f-=tmp;
- e[i^].f+=tmp;
- lim-=tmp;
- f+=tmp;
- if(!lim)return f;
- }
- }
- d[u]=;
- return f;
- }
- inline int Dinic(){
- int res=;
- while(BFS(S,T))res+=DFS(S,1e9);
- return res;
- }
- int r[mxn],c[mxn];
- vector<int>to[mxn];
- int main()
- {
- freopen("roundtable.in","r",stdin);
- freopen("roundtable.out","w",stdout);
- m=read();n=read();
- int i,j;
- int smm=;
- for(i=;i<=m;i++)r[i]=read(),smm+=r[i];//人数
- for(i=;i<=n;i++)c[i]=read();//餐桌容量
- S=;T=n+m+;
- for(i=;i<=n;i++){//餐桌
- add_edge(S,i,c[i]);
- add_edge(i,S,);
- }
- for(i=;i<=m;i++){
- for(j=;j<=n;j++){
- add_edge(j,i+n,);
- add_edge(i+n,j,);
- }
- }
- for(i=;i<=m;i++){
- add_edge(i+n,T,r[i]);
- add_edge(T,i+n,);
- }
- int ans=Dinic();
- if(ans!=smm){printf("0\n");return ;}
- for(i=;i<=mct;i++){
- if(e[i].f && e[i].u!=S && e[i].u!=T && e[i].v!=S && e[i].v!=T && e[i].u>e[i].v){
- // printf("%d (%d) to %d\n",e[i].u,e[i].u-n,e[i].v);
- to[e[i].u-n].push_back(e[i].v);
- }
- }
- printf("1\n");
- for(i=;i<=m;i++){
- for(j=;j<to[i].size();j++){
- printf("%d ",to[i][j]);
- }
- printf("\n");
- }
- return ;
- }
COGS729. [网络流24题] 圆桌聚餐的更多相关文章
- Cogs 729. [网络流24题] 圆桌聚餐
[网络流24题] 圆桌聚餐 ★★ 输入文件:roundtable.in 输出文件:roundtable.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设有来自m 个不同单 ...
- 【PowerOJ1740&网络流24题 圆桌聚餐】(最大流)
题意: 来自n个不同国家的代表开会,每个国家代表数为ci 会场有m张圆桌,每张桌子可容纳mi人 不希望有同一个国家的代表在同一张桌子上就餐 设计一个合法方案 (n,m<=300) 思路:最大流, ...
- 网络流24题——圆桌问题 luogu 3254
题目传送门:这里 这是网络流24题里最简单的一道,我们从这里开始 虽然是网络流24题之一,但可以不用网络流... 本题采用贪心即可 有一个很显然的思想:在分配每一组时,我们都应当优先分配给当前可容纳人 ...
- [洛谷P3254] [网络流24题] 圆桌游戏
Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...
- [cogs729] [网络流24题#5] 圆桌聚餐 [网络流,最大流,多重二分图匹配]
建图:从源点向单位连边,边权为单位人数,从单位向圆桌连边,边权为1,从圆桌向汇点连边,边权为圆桌容量. #include <iostream> #include <algorithm ...
- LibreOJ 6004. 「网络流 24 题」圆桌聚餐 网络流版子题
#6004. 「网络流 24 题」圆桌聚餐 内存限制:256 MiB时间限制:5000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数 ...
- Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流)
Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流) Description 假设有来自n个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri.会议餐厅共有m张餐桌,每张餐桌 ...
- 【最大流/二分图匹配】【网络流24题】【P3254】 圆桌问题
Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...
- 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)
写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...
随机推荐
- Android 四大组件之再论service
service常见的有2种方式,本地service以及remote service. 这2种的生命周期,同activity的通信方式等,都不相同. 关于这2种service如何使用,这里不做介绍,只是 ...
- Play Framework 完整实现一个APP(九)
添加增删改查操作 1.开启CRUD Module 在/conf/application.conf 中添加 # Import the crud module module.crud=${play.pat ...
- EntityFramework 数据库连接可用代码动态设定
摘自:http://blog.csdn.net/dyllove98/article/details/9289553 数据库生成位置可控制(其实主要就是DbContext的构造函数) 1.使用DbCon ...
- Linux iptables 防火墙
内容摘要 防火墙 防火墙定义 防火墙分类 netfilter/iptables netfilter 设计架构 iptables 简述 iptables 命令详解 命令语法 table 参数 comma ...
- SQL Server 2008 R2——查找最小nIndex,nIndex存在而nIndex+1不存在 求最小连续数组中的最大值
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- Linux I/O多路复用
Linux中一切皆文件,不论是我们存储在磁盘上的字符文件,可执行文件还是我们的接入电脑的I/O设备等都被VFS抽象成了文件,比如标准输入设备默认是键盘,我们在操作标准输入设备的时候,其实操作的是默认打 ...
- kmeans算法c语言实现,能对不同维度的数据进行聚类
最近在苦于思考kmeans算法的MPI并行化,花了两天的时间把该算法看懂和实现了串行版. 聚类问题就是给定一个元素集合V,其中每个元素具有d个可观察属性,使用某种算法将V划分成k个子集,要求每个子集内 ...
- 利用keepalived和haproxy配置mysql的高可用负载均衡
实验系统:CentOS 6.6_x86_64(2.6.32-504.30.3.el6.x86_64) 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:k ...
- postman使用之三:API请求和查看响应结果
请求 postman支持很多请求类型,界面左侧可以看到请求类型:get.post.put.patch等,右侧是发送和保存按钮,下方是请求支持的认证方式.信息头.信息体.私有脚本和测试结果.下面我们介绍 ...
- [excel玩转表格教程][1G][AVI]
[excel玩转表格教程][1G][AVI] 下载地址 :http://www.fu83.cn/thread-222-1-1.html