POJ 1149(最大流)
这道题应该都能想到朴素的有n*m+个点的建图方案吧,呵呵,显然是不行的。
那么怎么办?
其实我们可以这样想:一个人能买到的猪有两个来源:
①来自自己第一次打开的猪圈
②来自之前别人打开的猪圈
想到了这个实质,见图就简单了!
我们设一个超级源点S,和超级汇点T,对于每一个人,从S向他连一条容量为K的边(K是由这个人第一次打开的猪圈的初始猪的个数之和),然后对于一个人A,他打开了P猪圈,
且P猪圈之前被B打开过,则从B向A连一条容量为INF的边,最后,对于每一个人,都向T连一条容量为lim[i](表示每个人的购买猪的上限)的边,跑在最大流就行!
代码:
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(最大流)相关推荐
- POJ 1149 最大流建图 PIGS
题意: 给出猪圈个数 m 和买家人数 n 然后给出m个猪圈的猪的头数.. 接下来 n 行.. 给出mm a1 a2 .. a(mm) k 例如 2 1 5 3 表示第i+1个用户 有mm(2) 个猪圈 ...
- poj 1149 PIGS【最大流】
建图:s向所有猪圈的第一个顾客连流量为这个猪圈里住的数量,然后对于之后每个来这个猪圈的顾客,由他前一个顾客向他连边权为无穷的边,然后每个顾客向t连流量为这个顾客购买上限的边.然后跑最大流 #inclu ...
- POJ 1149 PIGS 最大流建模
点击打开链接 PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 14204 Accepted: 6305 Desc ...
- poj 1273 最大流
题目链接:http://poj.org/problem?id=1273 a.EK算法:(Edmond-Karp): 用BFS不断找增广路径,当找不到增广路径时当前流量即为最大流. b.dinic算法: ...
- POJ 3532 基尔霍夫电流定律 + 高斯消元
题意 传送门 POJ 3532 题解 基尔霍夫电流定律(KCLKCLKCL):在集总参数电路中,任一瞬间,流入或流出电路中任一节点的电流代数和恒等于零.若规定流出为正,则流入为负,KCLKCLKCL ...
- poj 3614(最大流)
Sunscreen Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6682 Accepted: 2350 Descrip ...
- [poj 3436]最大流+输出结果每条边流量
题目链接:http://poj.org/problem?id=3436 大力套kuangbin板过了orz #include<cstdio> #include<cstring> ...
- POJ 1459--最大流算法
cin竟然比scanf慢了十几倍,想不通 #include <iostream> #include <string> #include <vector> #incl ...
- poj 3281(最大流)
解题思路: 这是道匹配的问题,最近刚学网络流,所以想用网络流去做..按照题目要求,我开始建立的是food----cow----drink的图,源点与所有的food的编号连接,所有的drink的编号与汇 ...
最新文章
- VMware上实现LVS负载均衡(NAT)
- 27个人类基因被重新命名,只因Excel总把它们自动纠正成日期
- 一周一论文(翻译)——[SIGMOD 2015] Congestion Control for Large-Scale RDMA
- SAP Spartacus里和focus相关的directive之间的继承关系
- JMS和Spring:有时很重要的小事情
- 【Electron】Electron开发入门(八):自定义electron框架外壳(shell)的菜单(Menu)...
- 对中级Linux用户有用的20个命令
- 新年第一天,3000台Apache服务器宕机
- 本地html如何导出pdf,html表格以pdf格式导出到本地
- jsp servlet示例_Java Servlet Cookies示例
- 容量规划的一些探讨与实践
- iframe中嵌入报表
- fastadmin上传视频的操作
- win10易升_电脑win7系统免费自动升级至win10系统,获得持续软件和安全更新
- 无线传感器网络(双语)复习
- “新元宇宙”奇科幻小说原创作品《地球人奇游天球记》第四回飞离地球
- 探访IBM企业级区块链-CSDN公开课-专题视频课程
- Java实现 kiosk模式,Android中的Kiosk模式
- 正则只保留括号里的内容
- oracle调优总结 本文转自:http://blog.csdn.net/wonth/article/details/1670366
热门文章
- 简易的深度学习框架Keras代码解析与应用
- vue传递数组对象_详解vue组件三大核心概念
- 分布式 java 应用:基础与实践_单集群数据超1000亿,微服务架构下分布式数据库应用实践...
- mysql run sql files_HeidiSQL_5.1_Sourcecode
- Mac安装mysql数据库【亲测有用】
- js 获取中括号里面字符串_一日一技:一次性把字符串用多个分隔符分割
- vue中使用高德地图 amap--基础使用方法
- Linux 获取屏幕分辨率与窗口行列数(c/c++)
- Jmeter(三)断言和关联
- 用mac的safari浏览器调试ios手机的网页