这道题应该都能想到朴素的有n*m+个点的建图方案吧,呵呵,显然是不行的。

那么怎么办?

其实我们可以这样想:一个人能买到的猪有两个来源:

①来自自己第一次打开的猪圈

②来自之前别人打开的猪圈

想到了这个实质,见图就简单了!

我们设一个超级源点S,和超级汇点T,对于每一个人,从S向他连一条容量为K的边(K是由这个人第一次打开的猪圈的初始猪的个数之和),然后对于一个人A,他打开了P猪圈,

且P猪圈之前被B打开过,则从B向A连一条容量为INF的边,最后,对于每一个人,都向T连一条容量为lim[i](表示每个人的购买猪的上限)的边,跑在最大流就行!

代码:

View Code

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cstring>
 4 #include <iostream>
 5 #define N 2010
 6 #define M  200100
 7 #define INF 100000000
 8 using namespace std;
 9 int head[N],next[M],to[M],len[M],cnt,S,T,n,m,layer[N],q[M<<4];
10 int cus[N],ini[N],num[N],key[N][N],lim[N],ww[N];
11 inline void add(int u,int v,int w)
12 {
13     to[cnt]=v; len[cnt]=w; next[cnt]=head[u]; head[u]=cnt++;
14     to[cnt]=u; len[cnt]=0; next[cnt]=head[v]; head[v]=cnt++;
15 }
16 void read()
17 {
18     memset(cus,0,sizeof cus);
19     memset(ww,0,sizeof ww);
20     memset(head,-1,sizeof head);
21     cnt=0;
22     S=0; T=n+1;
23     for(int i=1;i<=m;i++) scanf("%d",&ini[i]);
24     for(int i=1;i<=n;i++)
25     {
26         scanf("%d",&num[i]);
27         for(int j=1;j<=num[i];j++)
28         {
29             scanf("%d",&key[i][j]);
30             //cus[i]表示上一次开启i猪圈的人的编号
31             if(cus[key[i][j]]==0)//i是第一个开key[i][j]猪圈的人
32             {
33                 ww[i]+=ini[key[i][j]];
34                 cus[key[i][j]]=i;//更新
35             }
36             else
37             {
38                 add(cus[key[i][j]],i,INF);
39                 cus[key[i][j]]=i;
40             }
41         }
42         scanf("%d",&lim[i]);
43     }
44     for(int i=1;i<=n;i++) add(S,i,ww[i]),add(i,T,lim[i]);
45 }
46 bool bfs()
47 {
48     memset(layer,-1,sizeof layer);
49     int h=1,t=2,sta;
50     q[1]=S; layer[S]=0;
51     while(h<t)
52     {
53         sta=q[h++];
54         for(int i=head[sta];~i;i=next[i])
55             if(len[i]>0&&layer[to[i]]<0)
56             {
57                 layer[to[i]]=layer[sta]+1;
58                 q[t++]=to[i];
59             }
60     }
61     return layer[T]!=-1;
62 }
63 int find(int u,int cur_flow)
64 {
65     if(u==T) return cur_flow;
66     int result=0,tmp;
67     for(int i=head[u];~i&&result<cur_flow;i=next[i])
68         if(len[i]>0&&layer[to[i]]==layer[u]+1)
69         {
70             tmp=find(to[i],min(cur_flow-result,len[i]));
71             len[i]-=tmp; len[i^1]+=tmp; result+=tmp;
72         }
73     if(!result) layer[u]=-1;
74     return result;
75 }
76 int dinic()
77 {
78     int ans=0;
79     while(bfs()) ans+=find(S,INF);
80     return ans;
81 }
82 int main()
83 {
84     while(scanf("%d%d",&m,&n)!=EOF)
85     {
86         read();
87         printf("%d\n",dinic());
88     }
89     return 0;
90 }

转载于:https://www.cnblogs.com/proverbs/archive/2012/08/27/2659317.html

POJ 1149(最大流)相关推荐

  1. POJ 1149 最大流建图 PIGS

    题意: 给出猪圈个数 m 和买家人数 n 然后给出m个猪圈的猪的头数.. 接下来 n 行.. 给出mm a1 a2 .. a(mm) k 例如 2 1 5 3 表示第i+1个用户 有mm(2) 个猪圈 ...

  2. poj 1149 PIGS【最大流】

    建图:s向所有猪圈的第一个顾客连流量为这个猪圈里住的数量,然后对于之后每个来这个猪圈的顾客,由他前一个顾客向他连边权为无穷的边,然后每个顾客向t连流量为这个顾客购买上限的边.然后跑最大流 #inclu ...

  3. POJ 1149 PIGS 最大流建模

    点击打开链接 PIGS Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14204   Accepted: 6305 Desc ...

  4. poj 1273 最大流

    题目链接:http://poj.org/problem?id=1273 a.EK算法:(Edmond-Karp): 用BFS不断找增广路径,当找不到增广路径时当前流量即为最大流. b.dinic算法: ...

  5. POJ 3532 基尔霍夫电流定律 + 高斯消元

    题意 传送门 POJ 3532 题解 基尔霍夫电流定律(KCLKCLKCL):在集总参数电路中,任一瞬间,流入或流出电路中任一节点的电流代数和恒等于零.若规定流出为正,则流入为负,KCLKCLKCL ...

  6. poj 3614(最大流)

    Sunscreen Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6682   Accepted: 2350 Descrip ...

  7. [poj 3436]最大流+输出结果每条边流量

    题目链接:http://poj.org/problem?id=3436 大力套kuangbin板过了orz #include<cstdio> #include<cstring> ...

  8. POJ 1459--最大流算法

    cin竟然比scanf慢了十几倍,想不通 #include <iostream> #include <string> #include <vector> #incl ...

  9. poj 3281(最大流)

    解题思路: 这是道匹配的问题,最近刚学网络流,所以想用网络流去做..按照题目要求,我开始建立的是food----cow----drink的图,源点与所有的food的编号连接,所有的drink的编号与汇 ...

最新文章

  1. VMware上实现LVS负载均衡(NAT)
  2. 27个人类基因被重新命名,只因Excel总把它们自动纠正成日期
  3. 一周一论文(翻译)——[SIGMOD 2015] Congestion Control for Large-Scale RDMA
  4. SAP Spartacus里和focus相关的directive之间的继承关系
  5. JMS和Spring:有时很重要的小事情
  6. 【Electron】Electron开发入门(八):自定义electron框架外壳(shell)的菜单(Menu)...
  7. 对中级Linux用户有用的20个命令
  8. 新年第一天,3000台Apache服务器宕机
  9. 本地html如何导出pdf,html表格以pdf格式导出到本地
  10. jsp servlet示例_Java Servlet Cookies示例
  11. 容量规划的一些探讨与实践
  12. iframe中嵌入报表
  13. fastadmin上传视频的操作
  14. win10易升_电脑win7系统免费自动升级至win10系统,获得持续软件和安全更新
  15. 无线传感器网络(双语)复习
  16. “新元宇宙”奇科幻小说原创作品《地球人奇游天球记》第四回飞离地球
  17. 探访IBM企业级区块链-CSDN公开课-专题视频课程
  18. Java实现 kiosk模式,Android中的Kiosk模式
  19. 正则只保留括号里的内容
  20. oracle调优总结 本文转自:http://blog.csdn.net/wonth/article/details/1670366

热门文章

  1. 简易的深度学习框架Keras代码解析与应用
  2. vue传递数组对象_详解vue组件三大核心概念
  3. 分布式 java 应用:基础与实践_单集群数据超1000亿,微服务架构下分布式数据库应用实践...
  4. mysql run sql files_HeidiSQL_5.1_Sourcecode
  5. Mac安装mysql数据库【亲测有用】
  6. js 获取中括号里面字符串_一日一技:一次性把字符串用多个分隔符分割
  7. vue中使用高德地图 amap--基础使用方法
  8. Linux 获取屏幕分辨率与窗口行列数(c/c++)
  9. Jmeter(三)断言和关联
  10. 用mac的safari浏览器调试ios手机的网页