看到题目,产生第一反应,是否可以匹配的是这么多。那么连边跑一遍最大流就行了。

从源点向每个单位连一条长度为l的边,然后所有单位和餐桌分别连边,流量为1,所有餐桌向汇点连边,流量为餐桌容量。
然后跑一遍最大流即可。

输出方案的时候直接暴力枚举一个单位的所有出边即可,如果不为0,那么说明使用过,即可输出。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #define ll long long
  8. #define inf 50000000
  9. #define re register
  10. #define id n*(i-1)+j
  11. using namespace std;
  12. struct po
  13. {
  14. int from,to,dis,nxt;
  15. }edge[];
  16. int head[],cur[],dep[],n,m,s,t,u,num=-,x,y,l,tot,sum,d;
  17. int nm,a[][];
  18. inline int read()
  19. {
  20. int x=,c=;
  21. char ch=' ';
  22. while((ch>''||ch<'')&&ch!='-')ch=getchar();
  23. while(ch=='-')c*=-,ch=getchar();
  24. while(ch<=''&&ch>='')x=x*+ch-'',ch=getchar();
  25. return x*c;
  26. }
  27. inline void add_edge(int from,int to,int dis)
  28. {
  29. edge[++num].nxt=head[from];
  30. edge[num].from=from;
  31. edge[num].to=to;
  32. edge[num].dis=dis;
  33. head[from]=num;
  34. }
  35. inline void add(int from,int to,int dis)
  36. {
  37. add_edge(from,to,dis);
  38. add_edge(to,from,);
  39. }
  40. inline bool bfs()
  41. {
  42. memset(dep,,sizeof(dep));
  43. queue<int> q;
  44. while(!q.empty())
  45. q.pop();
  46. dep[s]=;
  47. q.push(s);
  48. while(!q.empty())
  49. {
  50. int u=q.front();
  51. q.pop();
  52. for(re int i=head[u];i!=-;i=edge[i].nxt)
  53. {
  54. int v=edge[i].to;
  55. if(edge[i].dis>&&dep[v]==)
  56. {
  57. dep[v]=dep[u]+;
  58. if(v==t)
  59. return ;
  60. q.push(v);
  61. }
  62. }
  63. }
  64. return ;
  65. }
  66. inline int dfs(int u,int dis)
  67. {
  68. if(u==t)
  69. return dis;
  70. int diss=;
  71. for(re int& i=cur[u];i!=-;i=edge[i].nxt)
  72. {
  73. int v=edge[i].to;
  74. if(edge[i].dis!=&&dep[v]==dep[u]+)
  75. {
  76. int check=dfs(v,min(dis,edge[i].dis));
  77. if(check>)
  78. {
  79. dis-=check;
  80. diss+=check;
  81. edge[i].dis-=check;
  82. edge[i^].dis+=check;
  83. if(dis==) break;
  84. }
  85. }
  86. }
  87. return diss;
  88. }
  89. inline int dinic()
  90. {
  91. int ans=;
  92. while(bfs())
  93. {
  94. for(re int i=s;i<=t;i++)
  95. cur[i]=head[i];
  96. while(int d=dfs(s,inf))
  97. ans+=d;
  98. }
  99. return ans;
  100. }
  101. inline void output(int x)
  102. {
  103. for(re int i=head[x];i!=-;i=edge[i].nxt)
  104. {
  105. if(edge[i].dis==)
  106. cout<<edge[i].to-n<<" ";
  107. }
  108. cout<<endl;
  109. }
  110. int main()
  111. {
  112. memset(head,-,sizeof(head));
  113. n=read();m=read();
  114. s=;t=n+m+;
  115. for(re int i=;i<=n;i++)
  116. {
  117. l=read();
  118. add(s,i,l);
  119. tot+=l;
  120. }
  121. for(re int i=;i<=m;i++)
  122. {
  123. l=read();
  124. add(i+n,t,l);
  125. }
  126. for(re int i=;i<=n;i++)
  127. for(re int j=;j<=m;j++)
  128. add(i,j+n,);
  129. sum=dinic();
  130. if(tot==sum)
  131. {
  132. cout<<""<<endl;
  133. for(re int i=;i<=n;i++)
  134. output(i);
  135. }else
  136. cout<<"";
  137. }

【P3254】圆桌问题(最大流,洛谷)的更多相关文章

  1. Luogu P3254 圆桌问题(最大流)

    P3254 圆桌问题 题面 题目描述 假设有来自 \(m\) 个不同单位的代表参加一次国际会议.每个单位的代表数分别为 \(r_i (i =1,2,--,m)\) . 会议餐厅共有 \(n\) 张餐桌 ...

  2. 图论--网络流--最大流 洛谷P4722(hlpp)

    题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...

  3. 洛谷P3254 圆桌问题(最大流)

    题意 $m$个不同单位代表参加会议,第$i$个单位有$r_i$个人 $n$张餐桌,第$i$张可容纳$c_i$个代表就餐 同一个单位的代表需要在不同的餐桌就餐 问是否可行,要求输出方案 Sol 比较zz ...

  4. AC日记——网络最大流 洛谷 P3376

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...

  5. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  6. 洛谷 P4016负载平衡问题【费用流】题解+AC代码

    洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...

  7. 洛谷P4003 无限之环(infinityloop)(网络流,费用流)

    洛谷题目传送门 题目 题目描述 曾经有一款流行的游戏,叫做 Infinity Loop,先来简单的介绍一下这个游戏: 游戏在一个 n ∗ m 的网格状棋盘上进行,其中有些小方格中会有水管,水管可能在格 ...

  8. 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】

    (题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...

  9. 洛谷 P3128 [USACO15DEC]最大流Max Flow-树上差分(点权/点覆盖)(模板题)

    因为徐州现场赛的G是树上差分+组合数学,但是比赛的时候没有写出来(自闭),背锅. 会差分数组但是不会树上差分,然后就学了一下. 看了一些东西之后,对树上差分写一点个人的理解: 首先要知道在树上,两点之 ...

  10. 【洛谷 P1251】 餐巾计划问题 (费用流)

    题目链接 我做的网络流24题里的第一题.. 想是不可能想到的,只能看题解. 首先,我们拆点,将一天拆成晚上和早上,每天晚上会受到脏餐巾(来源:当天早上用完的餐巾,在这道题中可理解为从原点获得),每天早 ...

随机推荐

  1. 什么是Base64加密?为什么要有Base64加密?

    产生这篇文章的动力在于对接腾讯云服务的时候每次都要进行Base64编码之后才能进行签名,之前只知道Base64是个算法,但是不知道为啥都用这个算法,这次为了链接Base64究竟是个什么东东才在网络上各 ...

  2. 云计算之路-阿里云上:SLB会话保持的一个坑

    冒着被大家厌烦的风险,今天再发一篇“云计算之路-阿里云上”.这是在前一篇发过之后真实发生的事情,我们觉得定位问题的过程值得分享.而且估计园子里不少朋友被这个问题骚扰过,我们有责任让大家知道问题的真正原 ...

  3. 帝国CMS 7.2数据导入后的参数修正

    1.日期转时间戮,HTML文件名,目录名更改 update cms_ecms_jdba set newstime = UNIX_TIMESTAMP(submitTime),titleurl = CON ...

  4. JavaBean 介绍

    // Person.java public class Person{ private String name; private int age; // 无参构造函数 public Person(){ ...

  5. Django框架视图类

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...

  6. 基于UDP的套接字、粘包问题

    一.基于UDP的套接字 UDP服务端 ss = socket() #创建一个服务器的套接字 ss.bind() #绑定服务器套接字 inf_loop: #服务器无限循环 cs = ss.recvfro ...

  7. 在MySQL数据库的表中可以给某个整数类型的字段赋字符串类型的值

  8. Java并发—同步容器和并发容器

    简述同步容器与并发容器 在Java并发编程中,经常听到同步容器.并发容器之说,那什么是同步容器与并发容器呢?同步容器可以简单地理解为通过synchronized来实现同步的容器,比如Vector.Ha ...

  9. RTSP客户端接收存储数据(live555库中的testRTSPClient实例)

    1.testRTSPClient简介 testRTSPClient是个简单的客户端实例,这个实例对rtsp数据交互作了详细的描述,其中涉及到rtsp会话的两个概念Source和Sink. Source ...

  10. win7开启特定端口

    win7开启特定端口        在xp系统的时代,修改防火墙很方便,很简单.windows7或许是做得过于复杂了.当然所谓安全性也是相当于其他之前版本的系统更高了.为什么要打开端口,肯定是在win ...