这个题目我敲了一个简单的EK,这不是难点

难点在于建图,按题目的要求 每个猪圈和顾客都建点的话,那也太多了。。。我看了Edelweiss里面的缩点方法才建好的图,哎,惭愧啊

实际那些猪圈根本不需要单独建点,猪圈无非就是向顾客输送流量 以及向同时开着的猪圈输送流量,这一步可以直接缩为,当某个猪圈被第一次打开,它里面的流量就全部输送给那个顾客那个点,而且可以叠加,因为每一次猪圈是可以互通的,而且猪圈本身是没有容量限制,如果有限制,那就还得再考虑。

此外,每次对猪圈的接下来的访问者都进行建边。用来输送之后的流量

处理好初始点和结束点。

#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 1<<30
using namespace std;
int m,n;
int pigs[],cap[][],f[][],vis[][],buys;
int inq[],cnt[];
void init(){
memset(cap,,sizeof cap);
memset(f,,sizeof cap);
memset(vis,,sizeof vis);
memset(inq,,sizeof inq);
memset(cnt,,sizeof cnt);
}
int ans,q[],a[],p[];
void ek()
{
ans=;
const int M=;
for (;;){
memset(a,,sizeof a);
int head,rear;
head=rear=;
a[]=INF;
q[rear++]=;
while(head!=rear){
int u=q[head++];
if (head>=M) head%=M;
for (int v=;v<=n+;v++) if (!a[v] && cap[u][v]>f[u][v]){
p[v]=u;
q[rear++]=v;
if (rear>=M) rear%=M;
a[v]=min(a[u],cap[u][v]-f[u][v]);
}
}
if (a[n+]==) break;
for (int u=n+;u!=;u=p[u]){
f[p[u]][u]+=a[n+];
f[u][p[u]]-=a[n+];
}
ans+=a[n+];
}
} int main()
{
while (scanf("%d%d",&m,&n)!=EOF)
{
init();
int tmp,a;
for (int i=;i<=m;i++) scanf("%d",&pigs[i]);
for (int i=;i<=n;i++){
scanf("%d",&tmp);
for (int j=;j<tmp;j++){
scanf("%d",&a);
vis[a][cnt[a]++]=i;
if (inq[a]) continue;
inq[a]=;
cap[][i]+=pigs[a];
}
scanf("%d",&buys);
cap[i][n+]=buys;
}
for (int i=;i<=m;i++){
for (int j=;j<cnt[i]-;j++){
int a=vis[i][j];
int b=vis[i][j+];
cap[a][b]=INF;
}
}
}
ek();
printf("%d\n",ans);
}
return ;
}

POJ 1149 网络流 合并建图的更多相关文章

  1. POJ - 1149 PIGS (建图思维+最大流)

    (点击查看原题) 题目分析 (以下均为 Edelweiss 大佬的思路,博主承认自己写不了这么好,但是学习的心促使我记录下这个好题的写法,所以代码是我写的) [题目大意] 有 M 个猪圈,每个猪圈里初 ...

  2. PIGS POJ - 1149网络流(最短增广路---广搜) + 建图

    题意: 第一行输入m和n,m是猪圈的数量,n是顾客的数量,下面n行 第 i+1行表示第i个顾客 , 输入第一个数字表示有几把猪圈的钥匙,后面输入对应的猪圈,最后一个数字输入顾客想买几头猪. 建图: 设 ...

  3. POJ 1637 Sightseeing tour 建图+网络流

    题意: 给定一个混合图,所谓混合图就是图中既有单向边也有双向边,现在求这样的图是否存在欧拉回路. 分析: 存在欧拉回路的有向图,必须满足[入度==出度],现在,有些边已经被定向,所以我们直接记录度数即 ...

  4. poj 3281 最大流+建图

    很巧妙的思想 转自:http://www.cnblogs.com/kuangbin/archive/2012/08/21/2649850.html 本题能够想到用最大流做,那真的是太绝了.建模的方法很 ...

  5. poj 3281 最大流建图

    题目链接:http://poj.org/problem?id=3281 #include <cstdio> #include <cmath> #include <algo ...

  6. [poj 3281]最大流+建图很巧妙

    题目链接:http://poj.org/problem?id=3281 看了kuangbin大佬的思路,还用着kuangbin板子orz   http://www.cnblogs.com/kuangb ...

  7. POJ 1161 Walls ( Floyd && 建图 )

    题意 :  在某国,城市之间建起了长城,每一条长城连接两座城市.每条长城互不相交.因此,从一个区域到另一个区域,需要经过一些城镇或者穿过一些长城.任意两个城市A和B之间最多只有一条长城,一端在A城市, ...

  8. POJ 2226 缩点建图+二分图最大匹配

    这个最小覆盖但不同于 POJ 3041,只有横或者竖方向连通的点能用一块板子覆盖,非连续的,就要用多块 所以用类似并查集方法,分别横向与竖向缩点,有交集的地方就连通,再走一遍最大匹配即可 一开始还有点 ...

  9. POJ 2374 线段树建图+Dijkstra

    题意: 思路: 线段树+Dijkstra(要堆优化的) 线段树要支持打标记 一个栅栏 拆成两个点 :左和右 新加一个栅栏的时候 看看左端点有没有被覆盖过 如果有的话 就分别从覆盖的那条线段的左右向当前 ...

随机推荐

  1. python符号//、%和/运算

    a = 9 print('这是%运算的结果'+str(a%2)) print('这是//运算的结果'+str(a//2)) print('这是/运算的结果'+str(a/2))运算结果为 这是%运算的 ...

  2. PyCharm无法找到已安装的Python类库的解决方法

    一.问题描述 软件系统:Windows10.JetBrains PyCharm Edu 2018.1.1 x64 在命令行cmd中安装python类库包Numpy.Matplotlib.Pandas. ...

  3. jquery解析

    OutOfMemory.CN β 聚客 代码 专栏 教程 Maven Gitter 标签 登录注册  好书:重构 改善既有代码的设计[京东   亚马逊] | 敏捷软件开发原则.模式与实践[京东   亚 ...

  4. loadrunner11完整卸载

    1.在控制面板中卸载掉loadrunner11的程序 2.删除loadrunner11安装目录 3.删除C盘(和安装目录下)   wlrun.*和vugen.* 4.删除回收站 5.清除注册表(运行r ...

  5. POJ 3292:Semi-prime H-numbers 筛选数

    Semi-prime H-numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8216   Accepted: 3 ...

  6. 51nod 1433:0和5

    1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  取消关注 小K手中有n张牌,每张牌上有一个一位数的数, ...

  7. javascript 原型链污染

    原理①javascript中构造函数就相当于类,并且可以将其实例化 ②javascript的每一个函数都有一个prototype属性,用来指向该构造函数的原型同样的javascript的每一个实例对象 ...

  8. net Core3.1 Swagger加JWT权限

    1.Swagger中开启JWT服务 #region swagger services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new ...

  9. angularJS MVC及$scope作用域

  10. 数据库建模工具pd的使用