link

其实网络流就是再考你如何去建边。

先见$S$,$T$为源点与汇点,然后将$S$连向每一个单位,流量为每个单位的人数,然后将每一个单位连向每一个餐桌,流量为$1$,最后在将每一个餐桌与$T$相连,流量为每个餐桌容量,然后跑一边$Dinic$最大流就行,只需要优化一点点,每次$dfs$增广多条增广路就行,第一问就做完了($0$还是$1$)。第二问要去求到底在那一桌,我们可以去扫描当前的图,然后若$a$,$b$相连,且$a$为单位,$b$为餐桌,并且当前流量等于$0$,则必$a$集团的人道$b$桌吃饭,然后就输出就行。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<climits>
  6. #include<queue>
  7. using namespace std;
  8. inline int read(){
  9. int f=,ans=;char c=getchar();
  10. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  11. while(c>=''&&c<=''){ans=ans*+c-'';c=getchar();}
  12. return f*ans;
  13. }
  14. queue<int> que;
  15. const int MAXN=;
  16. const int inf=INT_MAX;
  17. struct node{
  18. int u,v,w,nex;
  19. }x[MAXN<<];
  20. struct NODE{
  21. int edge,lst;
  22. }pre[MAXN<<];
  23. int m,n,S,T,cnt,head[MAXN],num[MAXN],lim[MAXN],deep[MAXN];
  24. void add(int u,int v,int w){
  25. x[cnt].u=u,x[cnt].v=v,x[cnt].w=w,x[cnt].nex=head[u],head[u]=cnt++;
  26. }
  27. bool bfs(){
  28. memset(deep,/,sizeof(deep));
  29. int INF=deep[];
  30. while(!que.empty()) que.pop();
  31. deep[S]=;que.push(S);
  32. while(!que.empty()){
  33. int xx=que.front();que.pop();
  34. for(int i=head[xx];i!=-;i=x[i].nex){
  35. if(x[i].w&&deep[x[i].v]>deep[xx]+){
  36. deep[x[i].v]=deep[xx]+;
  37. que.push(x[i].v);
  38. }
  39. }
  40. }
  41. return deep[T]!=INF;
  42. }
  43. int ST,lowflow,ans,VIS;
  44. inline int dfs(int xx,int flow){
  45. if(xx==T) {
  46. ans+=flow;
  47. VIS=;
  48. return flow;
  49. }
  50. int used=;
  51. for(int i=head[xx];i!=-;i=x[i].nex){
  52. if(deep[x[i].v]==deep[xx]+&&x[i].w){
  53. int slow=dfs(x[i].v,min(flow-used,x[i].w));
  54. if(slow){
  55. used+=slow;
  56. x[i].w-=slow;
  57. x[i^].w+=slow;
  58. if(used==flow) break;
  59. }
  60. }
  61. }
  62. return used;
  63. }
  64. inline int dinic(){
  65. while(bfs()){
  66. VIS=;
  67. while(VIS==){
  68. VIS=;
  69. dfs(S,inf);
  70. }
  71. }
  72. return ans;
  73. }
  74. int main(){
  75. memset(head,-,sizeof(head));
  76. m=read(),n=read();
  77. S=,T=n+m+;
  78. for(int i=;i<=m;i++){
  79. num[i]=read();add(S,i,num[i]),add(i,S,);
  80. for(int j=;j<=n;j++) add(i,j+m,),add(j+m,i,);
  81. ST+=num[i];
  82. }
  83. for(int i=;i<=n;i++){
  84. lim[i]=read();
  85. add(i+m,T,lim[i]),add(T,i+m,);
  86. }
  87. int st=dinic();
  88. if(st!=ST){printf("%d\n",);return ;}
  89. printf("%d\n",);
  90. for(int i=;i<=m;i++){
  91. for(int j=head[i];j!=-;j=x[j].nex){
  92. if(x[j].v>=m+&&x[j].v<=m+n+&&!x[j].w){
  93. printf("%d ",x[j].v-m);
  94. }
  95. }
  96. printf("\n");
  97. }
  98. }

[LOJ 6004] 圆桌聚餐的更多相关文章

  1. LibreOJ 6004 圆桌聚餐 (最大流)

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

  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. 【刷题】LOJ 6004 「网络流 24 题」圆桌聚餐

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

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

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

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

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

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

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

随机推荐

  1. 中文乱码的处理—@北河的ppt

  2. bson文件的切分

    描述 最近遇到问题需要将较大的bson文件(MongoDB导出的二进制json文件)按文档(记录)进行切分,网上这方面的资料实在太少,弄了一天多终于达到了基本要求(还不知道有没有BUG) 代码 pac ...

  3. JAVA基础学习之路(十)this关键字

    class Book { String name; int price; int num;//构造方法之间的互相调用解决了代码的重复问题,但是一定要留出口 public Book() { ,); } ...

  4. 换抵挡装置 (Kickdown,ACM/ICPC NEERC 2006,UVa1588

    题目描述:算法竞赛入门经典习题3-11 题目思路:1.两长条移动匹配 2.上下调换,取小者 #include <stdio.h> #include <string.h> int ...

  5. sql STUFF 分组

    ---将sql想关的数据放到一个字段里 select r.Region_Name, )) [text()] from City c2 inner join Region as r2 on c2.Reg ...

  6. Codeforces 96D Volleyball(最短路径)

    Petya loves volleyball very much. One day he was running late for a volleyball match. Petya hasn't b ...

  7. puppet学习笔记

    puppet优势:容易理解.用户较多.门槛低.简单.安装配置文件较少 puppet使用Ruby语言开发,安装puppet需要安装Ruby puppet运行环境:Redhat.Centos.Window ...

  8. 二叉搜索树(BST)---python实现

    github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义   二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree).   二叉搜 ...

  9. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...

  10. Unity3d学习日记(三)

      使用Application.LoadLevel(Application.loadedLevel);来重新加载游戏scene的方法已经过时了,我们可以使用SceneManager.LoadScene ...