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

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

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

/**
* Problem:POJ1149
* Author:Shun Yao
* Time:2013.9.13
* Result:
* Memo:
*/ #include <cstring>
#include <cstdio> #define INF 0x7fffffff
#define MAXT 1111 long m, n, s, t, f[MAXT], p2[MAXT], h[MAXT], sum[MAXT]; class Edge {
public:
long v, f;
Edge *op, *next;
Edge() {}
~Edge() {}
Edge(long V, long F, Edge *o, Edge *ne) : v(V), f(F), op(o), next(ne) {}
} *g[MAXT], *now[MAXT], *p1[MAXT]; void add(long x, long y, long c) {
g[x] = new Edge(y, c, 0, g[x]);
g[y] = new Edge(x, 0, g[x], g[y]);
g[x]->op = g[y];
} long *l, *r, q[MAXT];
void SAP() {
static char f;
static Edge *e;
static long i, ans, ww, w;
memset(h, -1, sizeof h);
memset(sum, 0, sizeof sum);
l = r = q;
*r++ = t;
h[t] = 0;
sum[0] = 1;
while (l < r) {
for (e = g[*l]; e; e = e->next)
if (h[e->v] == -1) {
++sum[h[e->v] = h[*l] + 1];
*r++ = e->v;
}
++l;
}
for (i = 0; i <= t; ++i) {
now[i] = g[i];
p1[i] = 0;
p2[i] = -1;
}
i = s;
ans = 0;
while (h[s] <= t) {
f = 0;
for (e = now[i]; e; e = e->next)
if (e->f > 0 && h[i] == h[e->v] + 1) {
now[i] = e;
p1[e->v] = e;
p2[e->v] = i;
i = e->v;
if (i == t) {
ww = INF;
for (w = t; w != s; w = p2[w])
if (ww > p1[w]->f)
ww = p1[w]->f;
for (w = t; w != s; w = p2[w]) {
p1[w]->f -= ww;
p1[w]->op->f += ww;
}
ans += ww;
i = s;
}
f = 1;
break;
}
if (!f) {
ww = t + 1;
for (e = g[i]; e; e = e->next)
if (e->f > 0 && ww > h[e->v]) {
ww = h[e->v];
now[i] = e;
}
++sum[ww > t ? ww : ++ww];
if (!--sum[h[i]])
break;
h[i] = ww;
if (i != s)
i = p2[i];
}
}
printf("%ld", ans);
} int main() {
static long i, j, k, A, B; #ifndef ONLINE_JUDGE
freopen("poj1149.in", "r", stdin);
freopen("poj1149.out", "w", stdout);
#endif scanf("%ld%ld", &m, &n);
s = 0;
t = n + m + 1;
for (i = 1; i <= m; ++i) {
scanf("%ld", &A);
add(s, i, A);
f[i] = i;
}
for (i = 1; i <= n; ++i) {
scanf("%ld", &A);
for (j = 1; j <= A; ++j) {
scanf("%ld", &k);
add(f[k], i + m, INF);
f[k] = i + m;
}
scanf("%ld", &B);
add(i + m, t, B);
}
SAP(); fclose(stdin);
fclose(stdout);
return 0;
}

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. hdu 4648

    求一个数列中  去掉一些连续的数之后 不改变对m取余后的值 就是求一个最长的连续子序列 对m取余后为0 我的方法可能比较水 #include<iostream> #include<c ...

  2. android 图片画画板

    canvas.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  3. 解决ubuntu中vi不能正常使用方向键与退格键的问题

    方案一: 问题: ubuntu中vi在编辑状态下方向键不能用,还有回格键不能删除等我们平时习惯的一些键都不能使用. 解决办法: 可以安装vim full版本,在full版本下键盘正常,安装好后同样使用 ...

  4. Android 权限查寻表

    示例 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=" ...

  5. dp和px,那些不得不吐槽的故事——Android平台图

    http://blog.sina.com.cn/s/blog_6499f8f101014ipq.html 一个优秀的手机软件,不仅要有精巧的功能,流畅的速度,让人赏心悦目的UI也往往是用户选择的重要理 ...

  6. bzoj1057,poj3250

    bzoj1057本质上是求最大子矩阵: 第一问是一个经典的O(n2)dp 第二问就是最大子矩阵,回眸一下当年卡了我很久的问题: 首先穷举显然不行(这不废话吗?): 首先我们预处理每个点可以最大向上延展 ...

  7. LeetCode Implement Trie (Prefix Tree) (实现trie树3个函数:插入,查找,前缀)

    题意:实现trie树的3个功能,只含小写字母的串. 思路:老实做即可! class TrieNode { public: TrieNode* chd[]; bool flag; // Initiali ...

  8. 触摸屏网站开发系列(一)-ios web App应用程序(ios meta)

    触摸屏网站的开发其实现在来讲比前几年移动端网站开发好多了,触摸屏设备IOS.Android.BBOS6等系统自带浏览器均为WEBKIT核心,这就说明PC上面尚未立行的HTML5 CSS3能够运用在这里 ...

  9. erlang判断语法结构:if/case/guard

    erlang 有好几种常用的判断结构语句,如 if.case.guard 等.文章将分别对 if / case /guard 的特点做介绍,以及用例说明 1.if 结构 if Condition 1  ...

  10. HttpServerUtility类

    HttpServerUtility是一个工具类,为了在后台处理请求方便获取到一些常用的类型,Asp.net将很多常用的东西封装到这里. 比如可以使用其进行URL编码解码, HTML编码解码等. // ...