题目链接 \(Click\) \(Here\)

水题。记得记一下边的流量有没有跑完。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 100010;
  4. const int M = 800010;
  5. const int INF = 0x3f3f3f3f;
  6. int cnt = -1, head[N];
  7. struct egde {
  8. int nxt, to, f;
  9. }e[M];
  10. void add_edge (int from, int to, int flw) {
  11. e[++cnt].nxt = head[from];
  12. e[cnt].to = to;
  13. e[cnt].f = flw;
  14. head[from] = cnt;
  15. }
  16. void add_len (int u, int v, int f) {
  17. add_edge (u, v, f);
  18. add_edge (v, u, 0);
  19. }
  20. int n, m, sum, id[210][310], hav[N], tak[N];
  21. int nd1 (int x) {return x;}
  22. int nd2 (int x) {return n + x;}
  23. queue <int> q;
  24. int cur[N], deep[N];
  25. bool bfs (int s, int t) {
  26. memcpy (cur, head, sizeof (head));
  27. memset (deep, 0x3f, sizeof (deep));
  28. q.push (s); deep[s] = 0;
  29. while (!q.empty ()) {
  30. int u = q.front (); q.pop ();
  31. for (int i = head[u]; ~i; i = e[i].nxt) {
  32. int v = e[i].to;
  33. if (deep[v] == INF && e[i].f) {
  34. deep[v] = deep[u] + 1;
  35. q.push (v);
  36. }
  37. }
  38. }
  39. return deep[t] != INF;
  40. }
  41. int dfs (int u, int t, int lim) {
  42. if (u == t || !lim) {
  43. return lim;
  44. }
  45. int tmp = 0, flow = 0;
  46. for (int &i = cur[u]; ~i; i = e[i].nxt) {
  47. int v = e[i].to;
  48. if (deep[v] == deep[u] + 1) {
  49. tmp = dfs (v, t, min (lim, e[i].f));
  50. lim -= tmp;
  51. flow += tmp;
  52. e[i ^ 0].f -= tmp;
  53. e[i ^ 1].f += tmp;
  54. if (!lim) break;
  55. }
  56. }
  57. return flow;
  58. }
  59. int main () {
  60. memset (head, -1, sizeof (head));
  61. cin >> n >> m;
  62. for (int i = 1; i <= n; ++i) {
  63. cin >> hav[i];
  64. sum += hav[i];
  65. if (hav[i] > m) {
  66. puts ("0");
  67. return 0;
  68. }
  69. }
  70. for (int i = 1; i <= m; ++i) {
  71. cin >> tak[i];
  72. }
  73. int s = n + m + 1;
  74. int t = n + m + 2;
  75. for (int i = 1; i <= n; ++i) add_len (s, nd1 (i), hav[i]);
  76. for (int i = 1; i <= m; ++i) add_len (nd2 (i), t, tak[i]);
  77. for (int i = 1; i <= n; ++i) {
  78. for (int j = 1; j <= m; ++j) {
  79. id[i][j] = cnt + 1;
  80. add_len (nd1 (i), nd2 (j), 1);
  81. }
  82. }
  83. int max_flow = 0;
  84. while (bfs (s, t)) {
  85. max_flow += dfs (s, t, INF);
  86. }
  87. if (max_flow != sum) {puts ("0"); return 0;}
  88. puts ("1");
  89. for (int i = 1; i <= n; ++i) {
  90. for (int j = 1; j <= m; ++j) {
  91. if (!e[id[i][j]].f) {
  92. printf ("%d ", j);
  93. }
  94. }
  95. printf ("\n");
  96. }
  97. }

Luogu P3254 圆桌问题的更多相关文章

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

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

  2. P3254 圆桌问题 网络流

    P3254 圆桌问题 #include <bits/stdc++.h> using namespace std; , inf = 0x3f3f3f; struct Edge { int f ...

  3. 网络流之P3254 圆桌问题

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

  4. 洛谷 [P3254] 圆桌问题

    简单最大流建图 #include <iostream> #include <cstdio> #include <cstring> #include <cmat ...

  5. P3254 圆桌问题

    题目链接 非常简单的一道网络流题 我们发现每个单位的人要坐到不同餐桌上,那也就是说每张餐桌上不能有同一单位的人.这样的话,我们对于每个单位向每张餐桌连一条边权为1的边,表示同一餐桌不得有相同单位的人. ...

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

    传送门 一道良心啊……没那么多麻烦了…… 从$S$向所有单位连边,容量为单位人数,从所有桌子向$T$连边,容量为桌子能坐的人数,从每一个单位向所有桌子连边,容量为$1$,然后跑一个最大流,看一看$S$ ...

  7. [洛谷P3254]圆桌问题

    题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表.要求同一个单位的代表不在同一个餐桌就餐.若可以,输出$1$以及其中一种方案,否则输出$0$ 题解: ...

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

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

  9. 洛谷 P3254 圆桌问题【最大流】

    s向所有单位连流量为人数的边,所有饭桌向t连流量为饭桌容量的边,每个单位向每个饭桌连容量为1的边表示这个饭桌只能坐这个单位的一个人.跑dinic如果小于总人数则无解,否则对于每个单位for与它相连.满 ...

随机推荐

  1. CSS 的三种样式 内联 内部 外部

    CSS:层叠样式表的缩写 就是 Cascading Style Sheets Cascading Style Sheets : 层叠样式表 优先级问题 :遵守就近原则  内联> 内部>外部 ...

  2. 解决spring多线程不共享事务的问题

    在一个事务中使用多线程操作数据库时,若同时存在对数据库的读写操作,可能出现数据读取的不准确,因为多线程将不会共享同一个事务(也就是说子线程和主线程的事务不一样),为了解决这个问题,可以使用spring ...

  3. 常用css样式处理

    1:如何设置html的input框的高度和宽度! 用style来设置,<input style="width:111px;height:111px">

  4. Overrid Equals Defined Operator

    public class Common { public override int GetHashCode() { return base.GetHashCode(); } public overri ...

  5. Linux各目录及每个目录的详细介绍

    http://www.cnblogs.com/duanji/p/yueding2.html

  6. 【XSY2808】董先生的休闲方案 组合数学

    题目描述 有\(n\)个方案,编号为\(1\ldots n\). 最开始你不知道每个方案的编号. 你要按顺序提出这些方案. 每一个时刻你要做以下事情: 如果你阅读过下一个方案,就提出这个方案. 否则随 ...

  7. 「浙大ACM」图森未来杯游记一篇以及简易口胡题解

    前言 蒟蒻有参加了ACM比赛,这一次有适合HY和慕容宝宝大佬一起比的,他们好巨啊,把我带飞了. 又是窝掌机,QAQ,他们仗着自己巨,就欺负窝... 我又打了\(4\)个小时的代码,而且那个键盘太恶心了 ...

  8. Vue中的slot内容分发

    ①概述: 简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示.不显示.在哪个地方显示.如何显示,就是slot分发负责的活. ②默认情况下 父组件在子组件内套的内容,是不显示的. 例如 ...

  9. DNA Evolution CodeForces - 828E(树状数组)

    题中有两种操作,第一种把某个位置的字母修改,第二种操作查询与[L, R]内与给出字符串循环起来以后对应位置的字母相同的个数.给出的字符串最大长度是10. 用一个四维树状数组表示 cnt[ATCG的编号 ...

  10. 洛谷P5111 zhtobu3232的线段树

    题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...