«问题描述:
假设有来自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

  1. 4 5
  2. 4 5 3 5
  3. 3 5 2 6 4

roundtable.out

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

最大流问题。

源点S向所有的单位连边,容量为单位人数;

每个单位向所有的桌子连边,容量为1 (只能派一个人);

每个桌子向汇点T连边,容量为桌子可容纳人数;

跑最大流,如果可以满流,说明问题有解。

检查每一条边,记录每个单位派代表去了哪些桌子,最后输出答案。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<queue>
  6. #include<vector>
  7. using namespace std;
  8. const int mxn=;
  9. int read(){
  10. int x=,f=;char ch=getchar();
  11. while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
  12. while(ch>='' && ch<=''){x=x*-''+ch;ch=getchar();}
  13. return x*f;
  14. }
  15. struct edge{
  16. int u,v,nxt,f;
  17. }e[mxn*];
  18. int hd[mxn],mct=;
  19. void add_edge(int u,int v,int f){
  20. e[++mct].v=v;e[mct].u=u;e[mct].f=f;e[mct].nxt=hd[u];hd[u]=mct;return;
  21. }
  22. int n,m;
  23. int S,T;
  24. int d[mxn];
  25. bool BFS(int s,int t){
  26. queue<int>q;
  27. memset(d,,sizeof d);
  28. d[s]=;
  29. q.push(s);
  30. while(!q.empty()){
  31. int u=q.front();q.pop();
  32. for(int i=hd[u];i;i=e[i].nxt){
  33. int v=e[i].v;
  34. if(!d[v] && e[i].f){
  35. d[v]=d[u]+;
  36. q.push(v);
  37. }
  38. }
  39. }
  40. return d[t];
  41. }
  42. int DFS(int u,int lim){
  43. if(u==T)return lim;
  44. int tmp,f=;
  45. for(int i=hd[u];i;i=e[i].nxt){
  46. int v=e[i].v;
  47. if(d[v]==d[u]+ && e[i].f){
  48. tmp=DFS(v,min(lim,e[i].f));
  49. e[i].f-=tmp;
  50. e[i^].f+=tmp;
  51. lim-=tmp;
  52. f+=tmp;
  53. if(!lim)return f;
  54. }
  55. }
  56. d[u]=;
  57. return f;
  58. }
  59. inline int Dinic(){
  60. int res=;
  61. while(BFS(S,T))res+=DFS(S,1e9);
  62. return res;
  63. }
  64. int r[mxn],c[mxn];
  65. vector<int>to[mxn];
  66. int main()
  67. {
  68. freopen("roundtable.in","r",stdin);
  69. freopen("roundtable.out","w",stdout);
  70. m=read();n=read();
  71. int i,j;
  72. int smm=;
  73. for(i=;i<=m;i++)r[i]=read(),smm+=r[i];//人数
  74. for(i=;i<=n;i++)c[i]=read();//餐桌容量
  75. S=;T=n+m+;
  76. for(i=;i<=n;i++){//餐桌
  77. add_edge(S,i,c[i]);
  78. add_edge(i,S,);
  79. }
  80. for(i=;i<=m;i++){
  81. for(j=;j<=n;j++){
  82. add_edge(j,i+n,);
  83. add_edge(i+n,j,);
  84. }
  85. }
  86. for(i=;i<=m;i++){
  87. add_edge(i+n,T,r[i]);
  88. add_edge(T,i+n,);
  89. }
  90. int ans=Dinic();
  91. if(ans!=smm){printf("0\n");return ;}
  92. for(i=;i<=mct;i++){
  93. 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){
  94. // printf("%d (%d) to %d\n",e[i].u,e[i].u-n,e[i].v);
  95. to[e[i].u-n].push_back(e[i].v);
  96. }
  97. }
  98. printf("1\n");
  99. for(i=;i<=m;i++){
  100. for(j=;j<to[i].size();j++){
  101. printf("%d ",to[i][j]);
  102. }
  103. printf("\n");
  104. }
  105. return ;
  106. }

COGS729. [网络流24题] 圆桌聚餐的更多相关文章

  1. Cogs 729. [网络流24题] 圆桌聚餐

    [网络流24题] 圆桌聚餐 ★★ 输入文件:roundtable.in 输出文件:roundtable.out 评测插件 时间限制:1 s 内存限制:128 MB «问题描述: 假设有来自m 个不同单 ...

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

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

  3. 网络流24题——圆桌问题 luogu 3254

    题目传送门:这里 这是网络流24题里最简单的一道,我们从这里开始 虽然是网络流24题之一,但可以不用网络流... 本题采用贪心即可 有一个很显然的思想:在分配每一组时,我们都应当优先分配给当前可容纳人 ...

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

    Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...

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

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

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

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

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

    Libre 6004 「网络流 24 题」圆桌聚餐(网络流,最大流) Description 假设有来自n个不同单位的代表参加一次国际会议.每个单位的代表数分别为 ri.会议餐厅共有m张餐桌,每张餐桌 ...

  8. 【最大流/二分图匹配】【网络流24题】【P3254】 圆桌问题

    Description 假设有来自m 个不同单位的代表参加一次国际会议.每个单位的代表数分别为ri (i =1,2,--,m). 会议餐厅共有n 张餐桌,每张餐桌可容纳ci (i =1,2,--,n) ...

  9. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

随机推荐

  1. ORACLE应用调优:请避免SQL做大量循环逻辑处理

    前阵子遇到一个案例:一个同事说以前一个运行很正常的包,突然间比以前慢了很多,执行时间非常长,晚上的作业调用这个包跑了几个小时也没有跑出数据.于是我在跟踪.优化过程中定位到包中一个存储过程的一段SQL, ...

  2. RMAN还原遭遇ORA-32006&ORA-27102错误

    案例环境:   服务器A: 操作系统 : Red Hat Enterprise Linux ES release 4 (Nahant Update 6) 数据库版本: Oracle Database ...

  3. ActiveMQ 5 入门

    apache-activemq-5.13.2 ActiveMQ使用JAAS授权的配置方式 <plugins> <!– 使用login.config配置授权用户 --> < ...

  4. Oracle11g的最佳灵活体系结构OFA

  5. js中数组遍历for与for in区别(强烈建议不要使用for in遍历数组)

    js中遍历数组的有两种方式 var array=['a'] //标准的for循环 for(var i=1;i<array.length;i++){ alert(array[i]) } //for ...

  6. cefsharp设置网页接受语言Accept-Language

    1.设置浏览器的请求控制器 webView.RequestHandler = new RequestHandler(); 2.新建RequestHandler类继承IRequestHandler接口, ...

  7. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. 洛谷P2964 [USACO09NOV]硬币的游戏A Coin Game

    题目描述 Farmer John's cows like to play coin games so FJ has invented with a new two-player coin game c ...

  9. MyBatis入门案例、增删改查

    一.MyBatis入门案例: ①:引入jar包 ②:创建实体类 Dept,并进行封装 ③ 在Src下创建大配置mybatis-config.xml <?xml version="1.0 ...

  10. java内部类

    1.内部类 2.内部类的名字不会单独存在,根据外部类名的存在而存在.内部类的名字可以和外部其他类的名字一样. 3.这个this.num打印的是inner类里面的num 4.在内部类访问外部类成员变量方 ...