[BZOJ1280][POJ1149]Emmy卖猪pigs

试题描述

Emmy在一个养猪场工作。这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙。顾客会到养猪场来买猪,一个接着一个。每一位顾客都会有一些猪圈的钥匙,他们会将这些猪圈打开并买走固定数目的猪。 所有顾客有的钥匙和他们需要买猪的数量在事先都告诉了Emmy,于是Emmy要订一个计划,使得卖出去的猪最多。 买卖的过程是这样的:一个顾客前来,并打开所有他可以打开的猪圈。然后Emmy从这些猪圈里牵出固定数目的猪卖给顾客(最多只能和顾客需要数相等),并可以重新安排这些开着的猪圈中的猪。 每个猪圈可以存放任意数目的猪。 写一个程序,使得Emmy能够卖出去尽可能多的猪。

输入

第一行有两个整数:\(M\) 和 \(N\),表示猪圈数和顾客数。 第二行有 \(M\) 个整数,表示每个猪圈初始时有多少猪。 接下来的 \(N\) 行按照前来的次序描述了每一个顾客,每行的格式如下:\(A\ K_1\ K_2 \cdots K_A\ B\) \(A\) 表示该顾客拥有的钥匙数,\(K_1 \cdots K_A\) 表示每个钥匙所对应的猪圈,\(B\) 表示该顾客需要购买的猪的数目。

输出

仅包含一个整数,即最多能卖出去的猪的数目。

输入示例

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

输出示例

  1. 7

数据规模及约定

\(1 \le M \le 1000\)

\(1 \le N \le 100\)

题解

首先源点向每个猪圈连一条容量为该猪圈内猪数目的边,然后每位客户向汇点连一条容量为该客户需要数的边。这是显然的。

那么根据“可以打乱”这个性质,我们可以直接在客户和客户之间连边,而不是把边连回猪圈。

这样,正解就产生了(以下边容量均为无穷):从猪圈向第一个有它钥匙的客户连边,然后有交集的客户之间连上边。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cctype>
  6. #include <algorithm>
  7. #include <vector>
  8. using namespace std;
  9. #define rep(i, s, t) for(int i = (s); i <= (t); i++)
  10. #define dwn(i, s, t) for(int i = (s); i >= (t); i--)
  11. int read() {
  12. int x = 0, f = 1; char c = getchar();
  13. while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }
  14. while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }
  15. return x * f;
  16. }
  17. #define maxn 1111
  18. #define maxm 24010
  19. #define oo 2147483647
  20. struct Edge {
  21. int from, to, flow;
  22. Edge() {}
  23. Edge(int _1, int _2, int _3): from(_1), to(_2), flow(_3) {}
  24. };
  25. struct Dinic {
  26. int n, m, s, t, head[maxn], nxt[maxm];
  27. Edge es[maxm];
  28. int vis[maxn], Q[maxn], hd, tl;
  29. int cur[maxn];
  30. void init() {
  31. m = 0; memset(head, -1, sizeof(head));
  32. return ;
  33. }
  34. void setn(int _) {
  35. n = _;
  36. return ;
  37. }
  38. void AddEdge(int a, int b, int c) {
  39. es[m] = Edge(a, b, c); nxt[m] = head[a]; head[a] = m++;
  40. es[m] = Edge(b, a, 0); nxt[m] = head[b]; head[b] = m++;
  41. return ;
  42. }
  43. bool BFS() {
  44. memset(vis, 0, sizeof(vis));
  45. vis[t] = 1;
  46. hd = tl = 0; Q[++tl] = t;
  47. while(hd < tl) {
  48. int u = Q[++hd];
  49. for(int i = head[u]; i != -1; i = nxt[i]) {
  50. Edge& e = es[i^1];
  51. if(!vis[e.from] && e.flow) {
  52. vis[e.from] = vis[u] + 1;
  53. Q[++tl] = e.from;
  54. }
  55. }
  56. }
  57. return vis[s] > 0;
  58. }
  59. int DFS(int u, int a) {
  60. if(u == t || !a) return a;
  61. int flow = 0, f;
  62. for(int& i = cur[u]; i != -1; i = nxt[i]) {
  63. Edge& e = es[i];
  64. if(vis[e.to] == vis[u] - 1 && (f = DFS(e.to, min(a, e.flow)))) {
  65. flow += f; a -= f;
  66. e.flow -= f; es[i^1].flow += f;
  67. if(!a) return flow;
  68. }
  69. }
  70. return flow;
  71. }
  72. int MaxFlow(int _s, int _t) {
  73. s = _s; t = _t;
  74. int flow = 0;
  75. while(BFS()) {
  76. rep(i, 1, n) cur[i] = head[i];
  77. flow += DFS(s, oo);
  78. }
  79. return flow;
  80. }
  81. } sol;
  82. #define maxpig 1010
  83. #define maxcus 110
  84. int n, p, A[maxpig];
  85. vector <int> customer[maxpig];
  86. bool G[maxcus][maxcus];
  87. int main() {
  88. n = read(); p = read(); int S = n + p + 1, T = n + p + 2;
  89. sol.init(); sol.setn(T);
  90. rep(i, 1, n) sol.AddEdge(S, i, read());
  91. rep(i, 1, p) {
  92. int k = read();
  93. while(k--) customer[read()].push_back(i);
  94. sol.AddEdge(i + n, T, read());
  95. }
  96. rep(i, 1, n) if(customer[i].size()) {
  97. sol.AddEdge(i, customer[i][0] + n, oo);
  98. rep(j, 1, (int)customer[i].size() - 1) {
  99. int a = customer[i][j-1], b = customer[i][j];
  100. if(!G[a][b]) sol.AddEdge(a + n, b + n, oo), G[a][b] = 1;
  101. }
  102. }
  103. printf("%d\n", sol.MaxFlow(S, T));
  104. return 0;
  105. }

[BZOJ1280][POJ1149]Emmy卖猪pigs的更多相关文章

  1. 【BZOJ1280】Emmy卖猪pigs 最大流

    [BZOJ1280]Emmy卖猪pigs Description Emmy在一个养猪场工作.这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位顾客都会有一些猪 ...

  2. BZOJ1280: Emmy卖猪pigs

    BZOJ1280: Emmy卖猪pigs https://lydsy.com/JudgeOnline/problem.php?id=1280 分析: 这题感觉还好,因为是有时间顺序,所以拆点做最大流即 ...

  3. Bzoj 1280: Emmy卖猪pigs

    1280: Emmy卖猪pigs Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 279  Solved: 182[Submit][Status][Dis ...

  4. BZOJ1280 Emmy卖猪pigs 网络流

    正解:网络流 解题报告: 传送门! 我网络流的基础题都还麻油做完就来做这个了,,,wsl,,, 首先想下最基础的构图方法 不难想到把猪圈和顾客分别当做节点,然后新建一个源点和汇点 然后考虑怎么连边,首 ...

  5. Pku1149 PIGS 卖猪

    题目链接:ヾ(≧∇≦*)ゝ Description Emmy在一个养猪场工作.这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙. 顾客会到养猪场来买猪,一个接着一个.每一位顾客都会有一些猪圈的钥匙,他 ...

  6. [bzoj1280]卖猪

    首先考虑猪无法流动,那么源点向每一个猪圈连猪圈中猪个数的边,每一个顾客向汇点连所需猪的边,每一个猪圈向能打开它的顾客连inf的边,跑最大流即可. 但考虑猪要流动,有一个十分巧妙地做法,将每一个顾客所有 ...

  7. POJ1149 PIGS [最大流 建图]

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20662   Accepted: 9435 Description ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. poj 1149 PIGS【最大流经典建图】

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 18727   Accepted: 8508 Description ...

随机推荐

  1. RAC基本使用

    @interface ViewController () @property (weak, nonatomic) IBOutlet lwRedView *redView; @property (wea ...

  2. OO终章

    一,第四单元架构设计 第一次作业:只有类图 1,重置MyClass,MyOperation等类,为使里面只有必要数据(name,id,visibility等).或方便组织数据(如MyClass作为其底 ...

  3. form 表单 和 jQuery HTML / CSS 方法($().html 类似的样式)

    1 有关链接 :http://www.runoob.com/tags/tag-form.html https://www.cnblogs.com/Jxwz/p/4509618.html https:/ ...

  4. DOM4j-中文API

    1.DOM4J简介       DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP. ...

  5. java Html&JavaScript面试题:用table显示n条记录,每3行换一次颜色,即1,2,3用红色字体,4,5,6用绿色字体,7,8,9用红颜色字体。

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Q&A - ABTesting是啥?

    举个简单的例子,当你有一个日IP过千的网站,而你的网站首页几百年没有更改了,这个时候你想启用新的网页,而你有害怕新的页面用户不一定就非常喜欢,那么这个时候你就需要进行A/B测试了.测试的方法是将老页面 ...

  7. 二十四、MySQL ALTER命令

    MySQL ALTER命令 当我们需要修改数据表名或者修改数据表字段时,就需要使用到MySQL ALTER命令. 开始本章教程前让我们先创建一张表,表名为:testalter_tbl. root@ho ...

  8. 汇编 if else 例子

    .text .global  _start _start: mov r1,#1 mov r2,#2 cmp r1, r2 bgt  branch1 add  r3,r1,r2 b  end branc ...

  9. 扒一扒 EventServiceProvider 源代码

    Ajax用一句话来说就是无须刷新页面即可从服务器取得数据.注意,虽然Ajax翻译过来叫异步JavaScript与XML,但是获得的数据不一定是XML数据,现在服务器端返回的都是JSON格式的文件. 完 ...

  10. Firebase Cloud Function 编写与部署

    1.设置和初始化 Firebase SDK for Cloud Functions (1).Cloud Functions 运行的是 Node v6.14.0,因此需要安装nodejs: https: ...