POJ1149 PIGS
想了好久啊。。。(#-.-)
开始想到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的更多相关文章
- POJ1149 PIGS 【最大流 + 构图】
题目链接:http://poj.org/problem?id=1149 PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- POJ1149 PIGS [最大流 建图]
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20662 Accepted: 9435 Description ...
- POJ1149 PIGS (网络流)
PIGS Time Limit: 1000MS M ...
- POJ1149 PIGS 【最大流量】
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16555 Accepted: 7416 Description ...
- poj1149 PIGS 最大流(神奇的建图)
一开始不看题解,建图出错了.后来发现是题目理解错了. if Mirko wants, he can redistribute the remaining pigs across the unlock ...
- 题解 POJ1149 Pigs
先翻译一下吧(题面可以在原OJ上找) Mirko在一个由M个锁着的猪舍组成的养猪场工作,Mirko无法解锁任何猪舍,因为他没有钥匙.客户纷纷来到农场.他们每个人都有一些猪舍的钥匙,并想购买一定数量的猪 ...
- POJ1149 PIGS(最大流)
题意: 有一个人,他有m个猪圈,每个猪圈里面有一定数量的猪,但是每个猪圈的门都是锁着的,他自己没有钥匙,只有顾客有钥匙,一天依次来了n个顾客,(记住是依次来的)他们每个人都有一些钥匙,和他 ...
- poj图论解题报告索引
最短路径: poj1125 - Stockbroker Grapevine(多源最短路径,floyd) poj1502 - MPI Maelstrom(单源最短路径,dijkstra,bellman- ...
- [BZOJ1280][POJ1149]Emmy卖猪pigs
[BZOJ1280][POJ1149]Emmy卖猪pigs 试题描述 Emmy在一个养猪场工作.这个养猪场有 \(M\) 个锁着的猪圈,但Emmy并没有钥匙.顾客会到养猪场来买猪,一个接着一个.每一位 ...
随机推荐
- scikit-learn安装
1.依赖包: Cython.rose.numpy.scipy.lapack.atlas http://blog.chinaunix.net/uid-22488454-id-3978860.html
- 【HTTP】Fiddler(一) - Fiddler简介和使用
1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包 ...
- codeforces #310 div1 E
算得上是比较水的E题了吧,自己想了想写了写居然1A了 对于这道题,我们很容易想到对于原图的一个边双,定向后任意两点间一定可达 那么我们可以求出原图的边双并将每个边双缩成一个点 那么原图就变成了无环的无 ...
- Repeater, DataList, 和GridView控件的区别
http://blog.sina.com.cn/s/blog_646dc75c0100h5p6.html http://www.cnblogs.com/phone/archive/2010/09/15 ...
- Qt:QT右键菜单
Qt QTableView 上加右键弹出菜单, 并复制选中的单元格内容到剪贴板中 http://wenku.baidu.com/view/c51cfb63cf84b9d528ea7a29.html h ...
- QT小技巧(书上没有的)
1. Layout本身不能控制隐藏和显示,但是可以在外面专门套一个Widget,然后控制这个Widget就可以达到相应的效果了. 2. 空目录居然也存在 if (QDir(""). ...
- Silverlight之OOB模式下的一些事
本文简介: 1.为什么要使用OOB?使用OOB的作用? 2.如何实现OOB模式 3.对OOB进行一些设置: 4.检测OOB的安装状态: 5.更新应用程序: 6.WebBrowser控件: 7.桌面通知 ...
- C语言字节对齐
转自:http://blog.csdn.net/21aspnet/article/details/6729724 文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透. 一 ...
- [原]数据库中的partitioning和sharding
1. 如何理解定义 在中文中,partitioning和sharding都有分区的意思.从大的方面来说,这两个词所执行的动作确实也和分区相关.partitioning在很多场合是vertical pa ...
- delphi使用 第三方控件
第三方控件安装时必须把所有的pas,dcu,dpk,res等文件复制到你的Lib目录下 然后通过dpk进行安装 安装后会多出来新的控件面板,新控件就在那里了 当然也有一些控件会安装到原有的面板上 比如 ...