题解:天啊,这道最大流真是水的一批……只需要每张桌子向每个单位建一条容量为1的边,源点向桌子建边,容量为桌子能坐的人数;单位向汇点建边,容量为单位人数即可,然后根据单位与桌子的连边值是否为一来了解每个单位配对的桌子即可

代码如下:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. #define inf 0x3f3f3f3f
  7. using namespace std;
  8. int head[],next[],w[],v[],deep[],cur[];
  9. int n,m,s,t,cnt;
  10. int init()
  11. {
  12. cnt=-;
  13. memset(head,-,sizeof(head));
  14. memset(next,-,sizeof(next));
  15. }
  16. void add(int from,int to,int cost)
  17. {
  18. cnt++;
  19. next[cnt]=head[from];
  20. w[cnt]=cost;
  21. v[cnt]=to;
  22. head[from]=cnt;
  23. }
  24. void add_edge(int from,int to,int cost)
  25. {
  26. add(from,to,cost);
  27. add(to,from,);
  28. }
  29. int bfs(int s,int t)
  30. {
  31. queue<int> q;
  32. memset(deep,,sizeof(deep));
  33. deep[s]=;
  34. q.push(s);
  35. while(!q.empty())
  36. {
  37. int u=q.front();
  38. q.pop();
  39. for(int i=head[u];i!=-;i=next[i])
  40. {
  41. if(w[i]>&&!(deep[v[i]]))
  42. {
  43. deep[v[i]]=deep[u]+;
  44. q.push(v[i]);
  45. }
  46. }
  47. }
  48. if(!deep[t])
  49. {
  50. return ;
  51. }
  52. return ;
  53. }
  54. int dfs(int u,int t,int dist)
  55. {
  56. if(u==t)
  57. {
  58. return dist;
  59. }
  60. for(int &i=cur[u];i!=-;i=next[i])
  61. {
  62. if(deep[v[i]]==deep[u]+&&w[i]!=)
  63. {
  64. int di=dfs(v[i],t,min(dist,w[i]));
  65. if(di>)
  66. {
  67. w[i]-=di;
  68. w[i^]+=di;
  69. return di;
  70. }
  71. }
  72. }
  73. return ;
  74. }
  75. int dinic(int s,int t)
  76. {
  77. int res=;
  78. while(bfs(s,t))
  79. {
  80. for(int i=s;i<=t;i++)
  81. {
  82. cur[i]=head[i];
  83. }
  84. while(int di=dfs(s,t,inf))
  85. {
  86. res+=di;
  87. }
  88. }
  89. return res;
  90. }
  91. int main()
  92. {
  93. int a[],b[],sum=;
  94. vector<int> g[];
  95. scanf("%d%d",&m,&n);
  96. init();
  97. s=;t=n+m+;
  98. for(int i=;i<=m;i++)
  99. {
  100. scanf("%d",&a[i]);
  101. add_edge(i+n,t,a[i]);
  102. sum+=a[i];
  103. }
  104. for(int i=;i<=n;i++)
  105. {
  106. scanf("%d",&b[i]);
  107. add_edge(s,i,b[i]);
  108. for(int j=;j<=m;j++)
  109. {
  110. add_edge(i,j+n,);
  111. }
  112. }
  113. int ans=dinic(s,t);
  114. if(ans==sum)
  115. {
  116. puts("");
  117. }
  118. else
  119. {
  120. puts("");
  121. return ;
  122. }
  123. for(int i=head[t];i!=-;i=next[i])
  124. {
  125. for(int j=head[v[i]];j!=-;j=next[j])
  126. {
  127. if(w[j]&&v[j]!=t)
  128. {
  129. g[v[i]-n].push_back(v[j]);
  130. }
  131. }
  132. }
  133. for(int i=;i<=n;i++)
  134. {
  135. for(int j=;j<g[i].size();j++)
  136. {
  137. printf("%d ",g[i][j]);
  138. }
  139. printf("\n");
  140. }
  141. }

LibreOJ 6004 圆桌聚餐 (最大流)的更多相关文章

  1. [LOJ 6004] 圆桌聚餐

    link 其实网络流就是再考你如何去建边. 先见$S$,$T$为源点与汇点,然后将$S$连向每一个单位,流量为每个单位的人数,然后将每一个单位连向每一个餐桌,流量为$1$,最后在将每一个餐桌与$T$相 ...

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

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

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

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

  4. AC日记——圆桌聚餐 cogs 729

    729. [网络流24题] 圆桌聚餐 ★★   输入文件:roundtable.in   输出文件:roundtable.out   评测插件时间限制:1 s   内存限制:128 MB «问题描述: ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Linux LED字符设备驱动

    // 申请IO资源 int gpio_request(unsigned gpio, const char *label); // 释放IO资源 void gpio_free(unsigned gpio ...

  2. 使用nagios插件 check_mysql_health 过程中遇到的error

    使用nagios插件 check_mysql_health 过程中遇到的error 1.如果在运行监控mysql插件的时候遇到了error安装以下依赖包就可以解决: yum install perl- ...

  3. FPGA前世今生(二)

    上期我们介绍了关于FPGA内部最基本的结构,在quartus下可以看到整体的结构. 这是在平面规划图下看到的结构,其中蓝色的小格代表一个LAB.四周边上浅棕色的小格代表IO口. 这是一个LAB的内部结 ...

  4. videojs集成--播放rtmp流

    之前说到已经把流推送过来了,这时候就可以使用videojs来进行显示播放. 首先要先有一个文件,那就是video-js.swf 因为,这种播放方式html已经不能很好的进行播放了,需要用到flash来 ...

  5. if-else 循环嵌套结构

    package com.a; import java.util.*; public class Core2 {         public static void main(String[] arg ...

  6. Tomcat下WebSocket最大连接数测试

    WebSocket现在很常用,想要测试tomcat的最大连接数,今天试了一个可行的办法和配置(之前是用全公司的设备一起来测试的,真机环境的测试收到网络的影响很大,其实真实环境应用中,网络才是webso ...

  7. php中mb_strlen,mb_substr根据中文长度截取字符串

    大于8截取,小于等于则不截取. 结合thinkphp模板引擎规则,代码如下: <,,'utf-8'}..<else/>{sh:$vo.name}</if> 这里if中的函 ...

  8. Dynamics CRM 2011 通过工作流发邮件时的权限问题

    场景: 在CRM中配置工作流,完成某个步骤后,发送邮件通知其他用户.发件人统一配置为管理员,收件人则根据业务需要设定动态值. 相关权限配置 首先启动流程的用户, 需要允许其他用户代表发送电子邮件 另外 ...

  9. shell脚本把昨天的txt打成tar包

    now=`date '+%Y-%m-%d %H:%M:%S'` echo ${now} yesterday1=`date -d yesterday +%Y-%m-%d` echo ${yestoday ...

  10. USACO2.1.3 三值排序

      Description 排序是一种很频繁的计算任务.现在考虑最多只有三值的排序问题.一个实际的例子是,当我们给某项竞赛的优胜者按金银铜牌序的时候. 在这个任务中可能的值只有三种1,2和3.我们用交 ...