想了好久啊。。。(#-.-)

开始想到m*n个点的构图,明显超时,于是考虑压缩节点个数

我们发现每个猪圈最后被有且只有一个人调整,于是想到对于一个人,连接他能调整的每个猪圈的上一个控制人。(不懂可以开代码  (・(ェ)・)   )

  1. /**
  2. * Problem:POJ1149
  3. * Author:Shun Yao
  4. * Time:2013.9.13
  5. * Result:
  6. * Memo:
  7. */
  8.  
  9. #include <cstring>
  10. #include <cstdio>
  11.  
  12. #define INF 0x7fffffff
  13. #define MAXT 1111
  14.  
  15. long m, n, s, t, f[MAXT], p2[MAXT], h[MAXT], sum[MAXT];
  16.  
  17. class Edge {
  18. public:
  19. long v, f;
  20. Edge *op, *next;
  21. Edge() {}
  22. ~Edge() {}
  23. Edge(long V, long F, Edge *o, Edge *ne) : v(V), f(F), op(o), next(ne) {}
  24. } *g[MAXT], *now[MAXT], *p1[MAXT];
  25.  
  26. void add(long x, long y, long c) {
  27. g[x] = new Edge(y, c, 0, g[x]);
  28. g[y] = new Edge(x, 0, g[x], g[y]);
  29. g[x]->op = g[y];
  30. }
  31.  
  32. long *l, *r, q[MAXT];
  33. void SAP() {
  34. static char f;
  35. static Edge *e;
  36. static long i, ans, ww, w;
  37. memset(h, -1, sizeof h);
  38. memset(sum, 0, sizeof sum);
  39. l = r = q;
  40. *r++ = t;
  41. h[t] = 0;
  42. sum[0] = 1;
  43. while (l < r) {
  44. for (e = g[*l]; e; e = e->next)
  45. if (h[e->v] == -1) {
  46. ++sum[h[e->v] = h[*l] + 1];
  47. *r++ = e->v;
  48. }
  49. ++l;
  50. }
  51. for (i = 0; i <= t; ++i) {
  52. now[i] = g[i];
  53. p1[i] = 0;
  54. p2[i] = -1;
  55. }
  56. i = s;
  57. ans = 0;
  58. while (h[s] <= t) {
  59. f = 0;
  60. for (e = now[i]; e; e = e->next)
  61. if (e->f > 0 && h[i] == h[e->v] + 1) {
  62. now[i] = e;
  63. p1[e->v] = e;
  64. p2[e->v] = i;
  65. i = e->v;
  66. if (i == t) {
  67. ww = INF;
  68. for (w = t; w != s; w = p2[w])
  69. if (ww > p1[w]->f)
  70. ww = p1[w]->f;
  71. for (w = t; w != s; w = p2[w]) {
  72. p1[w]->f -= ww;
  73. p1[w]->op->f += ww;
  74. }
  75. ans += ww;
  76. i = s;
  77. }
  78. f = 1;
  79. break;
  80. }
  81. if (!f) {
  82. ww = t + 1;
  83. for (e = g[i]; e; e = e->next)
  84. if (e->f > 0 && ww > h[e->v]) {
  85. ww = h[e->v];
  86. now[i] = e;
  87. }
  88. ++sum[ww > t ? ww : ++ww];
  89. if (!--sum[h[i]])
  90. break;
  91. h[i] = ww;
  92. if (i != s)
  93. i = p2[i];
  94. }
  95. }
  96. printf("%ld", ans);
  97. }
  98.  
  99. int main() {
  100. static long i, j, k, A, B;
  101.  
  102. #ifndef ONLINE_JUDGE
  103. freopen("poj1149.in", "r", stdin);
  104. freopen("poj1149.out", "w", stdout);
  105. #endif
  106.  
  107. scanf("%ld%ld", &m, &n);
  108. s = 0;
  109. t = n + m + 1;
  110. for (i = 1; i <= m; ++i) {
  111. scanf("%ld", &A);
  112. add(s, i, A);
  113. f[i] = i;
  114. }
  115. for (i = 1; i <= n; ++i) {
  116. scanf("%ld", &A);
  117. for (j = 1; j <= A; ++j) {
  118. scanf("%ld", &k);
  119. add(f[k], i + m, INF);
  120. f[k] = i + m;
  121. }
  122. scanf("%ld", &B);
  123. add(i + m, t, B);
  124. }
  125. SAP();
  126.  
  127. fclose(stdin);
  128. fclose(stdout);
  129. return 0;
  130. }

POJ1149 PIGS的更多相关文章

  1. POJ1149 PIGS 【最大流 + 构图】

    题目链接:http://poj.org/problem?id=1149 PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  2. POJ1149 PIGS [最大流 建图]

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

  3. POJ1149 PIGS (网络流)

                                                                             PIGS Time Limit: 1000MS   M ...

  4. POJ1149 PIGS 【最大流量】

    PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16555   Accepted: 7416 Description ...

  5. poj1149 PIGS 最大流(神奇的建图)

    一开始不看题解,建图出错了.后来发现是题目理解错了.  if Mirko wants, he can redistribute the remaining pigs across the unlock ...

  6. 题解 POJ1149 Pigs

    先翻译一下吧(题面可以在原OJ上找) Mirko在一个由M个锁着的猪舍组成的养猪场工作,Mirko无法解锁任何猪舍,因为他没有钥匙.客户纷纷来到农场.他们每个人都有一些猪舍的钥匙,并想购买一定数量的猪 ...

  7. POJ1149 PIGS(最大流)

    题意:       有一个人,他有m个猪圈,每个猪圈里面有一定数量的猪,但是每个猪圈的门都是锁着的,他自己没有钥匙,只有顾客有钥匙,一天依次来了n个顾客,(记住是依次来的)他们每个人都有一些钥匙,和他 ...

  8. poj图论解题报告索引

    最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...

  9. [BZOJ1280][POJ1149]Emmy卖猪pigs

    [BZOJ1280][POJ1149]Emmy卖猪pigs 试题描述 Emmy在一个养猪场工作.这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位 ...

随机推荐

  1. scikit-learn安装

    1.依赖包: Cython.rose.numpy.scipy.lapack.atlas http://blog.chinaunix.net/uid-22488454-id-3978860.html

  2. 【HTTP】Fiddler(一) - Fiddler简介和使用

    1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包 ...

  3. codeforces #310 div1 E

    算得上是比较水的E题了吧,自己想了想写了写居然1A了 对于这道题,我们很容易想到对于原图的一个边双,定向后任意两点间一定可达 那么我们可以求出原图的边双并将每个边双缩成一个点 那么原图就变成了无环的无 ...

  4. Repeater, DataList, 和GridView控件的区别

    http://blog.sina.com.cn/s/blog_646dc75c0100h5p6.html http://www.cnblogs.com/phone/archive/2010/09/15 ...

  5. Qt:QT右键菜单

    Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html h ...

  6. QT小技巧(书上没有的)

    1. Layout本身不能控制隐藏和显示,但是可以在外面专门套一个Widget,然后控制这个Widget就可以达到相应的效果了. 2. 空目录居然也存在 if (QDir(""). ...

  7. Silverlight之OOB模式下的一些事

    本文简介: 1.为什么要使用OOB?使用OOB的作用? 2.如何实现OOB模式 3.对OOB进行一些设置: 4.检测OOB的安装状态: 5.更新应用程序: 6.WebBrowser控件: 7.桌面通知 ...

  8. C语言字节对齐

    转自:http://blog.csdn.net/21aspnet/article/details/6729724 文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透. 一 ...

  9. [原]数据库中的partitioning和sharding

    1. 如何理解定义 在中文中,partitioning和sharding都有分区的意思.从大的方面来说,这两个词所执行的动作确实也和分区相关.partitioning在很多场合是vertical pa ...

  10. delphi使用 第三方控件

    第三方控件安装时必须把所有的pas,dcu,dpk,res等文件复制到你的Lib目录下 然后通过dpk进行安装 安装后会多出来新的控件面板,新控件就在那里了 当然也有一些控件会安装到原有的面板上 比如 ...