tyvj P1517 飘飘乎居士的乌龟(最大流)
P1517 飘飘乎居士的乌龟
背景
描述
输入格式
接下来一行m个整数(可能为0),第i个整数表示第i个窝中乌龟的数量。
接下来输入分为n组,每组3行输入,第i组表示第i个人的信息:
第一行一个整数xi,表示第i个人最多购买的乌龟数量
第二行一个整数pi以及pi整数,表示该顾客会在pi个指定的窝中挑选乌龟
第三行一个整数qi(qi可能为0)以及跟着的qi个正整数,表示在第i个人购买完乌龟后,飘飘乎居士会调整这qi个窝中乌龟的数量。
输出格式
测试样例1
输入
输入样例1:
2 4
2 2 5 0
3
1 3
2 1 410
2 4 3
0输入样例2:
2 4
1 2 3 3
3
2 1 4
2 4 34
1 3
4 1 2 3 4
输出
输出样例1:
7
输出样例2:
7
备注
Hint:样例一解释:飘飘乎居士4个窝,初始时,第一个窝里有2只乌龟,第二个窝里有2只乌龟,第三个窝里有5只乌龟;第四窝里没有乌龟,共有2位顾客来购买乌龟。
在 第一位顾客到来时,他想在3号窝中挑选乌龟,最多只想买3只乌龟。飘飘乎居士将3号窝中的乌龟出售。出售以后,3号窝剩下2只乌龟,飘飘乎居士可以调整 1、4号窝中乌龟的数量,将1号窝中的2只乌龟转入4号窝中,这样,1号窝没有乌龟,3号窝2只乌龟,4号窝有2只乌龟。
在第二个顾客来时,他想要在3 4号窝中挑选最多10只乌龟,飘飘乎居士将从1号窝调整到4号窝中的2只乌龟以及3号窝剩下的2只乌龟卖出。共卖出7只乌龟,也就是最后的答案。
数据范围:0<n、m<=10
每个窝初始时乌龟的数量以及每位顾客购买乌龟的数量<=100000
0<=Pi、qi<=n
数据保证输入的正确性。
【思路】
最大流。
构图:
1 对于每个龟窝建立n个结点,建立s t点。
2 连边:
(s,ui,twi) 表示龟的数量
(ui,tmp,INF),(tmp,t,xi) tmp为中转结点,限制pi个点的总流量
(qj,qj+1,INF) 表示乌龟的调换
(ui,ui+1,INF)
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<vector> 5 #define FOR(a,b,c) for(int a=(b);a<(c);a++) 6 using namespace std; 7 8 const int maxn = 500+10; 9 const int INF = 1e9; 10 11 struct Edge{ 12 int u,v,cap,flow; 13 }; 14 struct Dinic { 15 int n,m,s,t; 16 bool vis[maxn]; 17 int d[maxn],cur[maxn]; 18 vector<int> G[maxn]; 19 vector<Edge> es; 20 21 void init(int n) { 22 this->n=n; 23 es.clear(); 24 for(int i=0;i<n;i++) G[i].clear(); 25 } 26 void AddEdge(int u,int v,int cap) { 27 es.push_back((Edge){u,v,cap,0}); 28 es.push_back((Edge){v,u,0,0}); 29 m=es.size(); 30 G[u].push_back(m-2); 31 G[v].push_back(m-1); 32 } 33 34 bool BFS() { 35 queue<int> q; 36 memset(vis,0,sizeof(vis)); 37 q.push(s); vis[s]=1; d[s]=0; 38 while(!q.empty()) { 39 int u=q.front(); q.pop(); 40 for(int i=0;i<G[u].size();i++) { 41 Edge& e=es[G[u][i]]; 42 int v=e.v; 43 if(!vis[v] && e.cap>e.flow) { 44 vis[v]=1; 45 d[v]=d[u]+1; 46 q.push(v); 47 } 48 } 49 } 50 return vis[t]; 51 } 52 int DFS(int u,int a) { 53 if(u==t || a==0) return a; 54 int flow=0,f; 55 for(int& i=cur[u];i<G[u].size();i++){ 56 Edge& e=es[G[u][i]]; 57 int v=e.v; 58 if( d[v]==d[u]+1 && (f=DFS(v,min(a,e.cap-e.flow)))>0 ) { 59 e.flow+=f; 60 es[G[u][i]^1].flow-=f; 61 flow+=f,a-=f; 62 if(!a) break; 63 } 64 } 65 return flow; 66 } 67 int Maxflow(int s,int t) { 68 this->s=s , this->t=t; 69 int flow=0; 70 while(BFS()) { 71 memset(cur,0,sizeof(cur)); 72 flow+=DFS(s,INF); 73 } 74 return flow; 75 } 76 } dc; 77 78 int n,m; 79 int q[maxn]; 80 81 int main() { 82 scanf("%d%d",&n,&m); m++; 83 dc.init(n*m+2); 84 int s=n*m,t=s+1,x; 85 FOR(i,0,m-1) { 86 scanf("%d",&x); 87 dc.AddEdge(s,i,x); 88 } 89 int a,b,limit; 90 FOR(i,0,n) { 91 scanf("%d%d",&limit,&a); 92 int tmp=i*m+m-1; //中转结点 93 dc.AddEdge(tmp,t,limit); 94 FOR(j,0,a) { 95 scanf("%d",&b); b--; 96 dc.AddEdge(i*m+b,tmp,INF); 97 } 98 scanf("%d",&a); 99 FOR(j,0,a) scanf("%d",&q[j]),q[j]--; 100 if(i<n-1) FOR(j,0,a-1) { 101 dc.AddEdge(i*m+q[j],(i+1)*m+q[j+1],INF); 102 dc.AddEdge(i*m+q[j+1],(i+1)*m+q[j],INF); 103 } 104 } 105 FOR(i,0,n-1) FOR(j,0,m-1) 106 dc.AddEdge(i*m+j,(i+1)*m+j,INF); 107 int flow=dc.Maxflow(s,t); 108 printf("%d\n",flow); 109 return 0; 110 }
tyvj P1517 飘飘乎居士的乌龟(最大流)相关推荐
- TYVJ 1288 飘飘乎居士取能量块
背景 9月21日,pink生日:9月22日,lina生日:9月23日,轮到到飘飘乎居士(狂欢吧,(^__^) 嘻嘻--). 描述 9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番 ...
- Tyvj P1143 飘飘乎居士的约会
背景 一阵狂风吹过 只听"pong"的一声,飘飘乎居士降落了!!! 描述 又是美妙的一天,这天飘飘乎居士要和MM约会,因此他打扮的格外帅气.但是,因为打扮的时间花了太久,离约会 ...
- tyvj 1143 飘飘乎居士的约会 走迷宫(可穿墙一次)
From VioletHill ☆飘飘乎居士的约会 背景 Background 一阵狂风吹过 只听"pong"的一声,飘飘乎居士降落了! ...
- P1143 飘飘乎居士的约会
描述 又是美妙的一天,这天飘飘乎居士要和MM约会,因此他打扮的格外帅气.但是,因为打扮的时间花了太久,离约会的时间已经所剩无几. 幸运的是,现在飘飘乎居士得到了一张n*m的地图,图中左上角是飘飘乎居士 ...
- TYVJ1288 飘飘乎居士取能量块
描述 9月21日,今天是pink的生日,飘飘乎居士当然要去别人的领土大闹一番啦! 为了收集更多的能量到pink家大闹,飘飘乎居士准备从后花园中取出自己多年积攒的p个能量块.后花园一共被划分n个地区 ...
- tyvj1467 通向聚会的道路
背景 Candy住在一个被划分为n个区域的神奇小镇中,其中Candy的家在编号为n的区域,Candy生日这天,大家都急急忙忙赶去Candy家庆祝Candy的生日. 描述 Candy共有t个朋友 ...
- TYVJ1467 通往聚会的道路
[题目描述] Candy共有t个朋友住在不同的区域.小镇有m条道路,小镇的神奇之处在于其中的p1条道路只会在你走过区域的的个数为奇数时候开启,p2道路只会在你走过区域的个数为偶数的时候开启,剩下的道路 ...
- [NOIP集训]10月18日
今天的文件夹:10月18日.zip 今天脑子转不起来,想不出来动规了. Orz @张翰文学神 T1:快排,然后求连续数字的长度,简单判断即可. T2: 题2. 养zsc(pig.pas/c/cpp) ...
- 洛谷 P1088 火星人
题目描述 人类终于登上了火星的土地并且见到了神秘的火星人.人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法.这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学 ...
- JavaScript的表单验证
1. 长度限制 <script> function test() { if(document.a.b.value.length>50) { alert("不能超过50个字 ...
最新文章
- 数据结构之队列、双端队列
- 【云计算】4_CDN加速产品介绍
- Nginx使用SSL配置HTTPS
- 我们并非生活在“虚幻世界”宇宙或是三维空间
- GitHub 有望在中国开设子公司?
- Scala class
- 别和 Python 说再见了!丨搞不定它的程序员,到底怎么了?
- pytorch中RNN注意事项(关于input和output维度)
- 更新.xsd后,rdlc 数据源更新不了
- 最简单代码,适合没学编程的人玩
- 手机CPU处理器大解析
- [嵌入式学习必备网站分享]嵌入式开发必须收藏的二十个网站 内附超链接 实用 嵌入式单片机学习网站
- 欠四大银行信用卡不还,最终会怎么样?
- hadoop学习之----------IntelliJ IDEA上实现MapReduce中最简单的单词统计的程序(本地 和 hadoop 两种实现方式)...
- 云闪付华为P9指纹_截胡小米支付妥妥的!华为支付正式上线,支持25家银行
- 人生之路小游戏代码2
- IE网页出现js错误修复方法_离水的鱼_新浪博客
- 抢占国内射频前端主序市场,「慧智微」的打法是推可重构射频前端架构
- C语言编程,带颜色的字体
- LabVIEW基础-定时