热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【POJ1149&BZOJ1280】PIGS(最大流)

题意:Emmy在一个养猪场工作。这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙。顾客会到养猪场来买猪,一个接着一个。每一位顾客都会有一些猪圈的钥匙,他们会将这些猪圈打开并买走固定数目的猪。所

题意:Emmy在一个养猪场工作。这个养猪场有M个锁着的猪圈,但Emmy并没有钥匙。

顾客会到养猪场来买猪,一个接着一个。每一位顾客都会有一些猪圈的钥匙,他们会将这些猪圈打开并买走固定数目的猪。

所有顾客有的钥匙和他们需要买猪的数量在事先都告诉了Emmy,于是Emmy要订一个计划,使得卖出去的猪最多。

买卖的过程是这样的:一个顾客前来,并打开所有他可以打开的猪圈。

然后Emmy从这些猪圈里牵出固定数目的猪卖给顾客(最多只能和顾客需要数相等),并可以重新安排这些开着的猪圈中的猪。

每个猪圈可以存放任意数目的猪。 写一个程序,使得Emmy能够卖出去尽可能多的猪。

1 ≤ M ≤ 1000
1 ≤ N ≤ 100

思路:RYZ作业

考虑到如果有两个人拥有同一个猪圈的钥匙,则前一个人可以分配任意(不能超过他自己能拿到上限)数量的猪给后一个人

前一个人——>后一个人 OO

又发现他们之间不用全部两两连边,只需要按到来顺序,相邻连边

猪圈其实就是从源点出来的容量上限

源点——>某猪圈第一个人 a[i]

最后还有每个人购买的限制

每个人——>汇点 b[i]

也是网络流经典模型之一

  1 var head,vet,next,len,dis,gap,fan:array[0..110000]of longint;
  2     a,last:array[1..10000]of longint;
  3     m,n,i,j,x,y,z,tot,s,source,src:longint;
  4 
  5 procedure add(a,b,c:longint);
  6 begin
  7  inc(tot);
  8  next[tot]:=head[a];
  9  vet[tot]:=b;
 10  len[tot]:=c;
 11  head[a]:=tot;
 12 
 13  inc(tot);
 14  next[tot]:=head[b];
 15  vet[tot]:=a;
 16  len[tot]:=0;
 17  head[b]:=tot;
 18 end;
 19 
 20 function min(x,y:longint):longint;
 21 begin
 22  if xthen exit(x);
 23  exit(y);
 24 end;
 25 
 26 function dfs(u,aug:longint):longint;
 27 var e,v,t,flow,val:longint;
 28 begin
 29  if u=src then exit(aug);
 30  e:=head[u]; flow:=0; val:=s-1;
 31  while e<>0 do
 32  begin
 33   v:=vet[e];
 34   if len[e]>0 then
 35   begin
 36    if dis[u]=dis[v]+1 then
 37    begin
 38     t:=dfs(v,min(len[e],aug-flow));
 39     len[e]:=len[e]-t;
 40     len[fan[e]]:=len[fan[e]]+t;
 41     flow:=flow+t;
 42     if dis[source]>=s then exit(flow);
 43     if aug=flow then break;
 44    end;
 45    val:=min(val,dis[v]);
 46   end;
 47   e:=next[e];
 48  end;
 49  if flow=0 then
 50  begin
 51   dec(gap[dis[u]]);
 52   if gap[dis[u]]=0 then dis[source]:=s;
 53   dis[u]:=val+1;
 54   inc(gap[dis[u]]);
 55  end;
 56  exit(flow);
 57 end;
 58 
 59 function maxflow:longint;
 60 var ans:longint;
 61 begin
 62  fillchar(gap,sizeof(gap),0);
 63  fillchar(dis,sizeof(dis),0);
 64  gap[0]:=s; ans:=0;
 65  while dis[source]do ans:=ans+dfs(source,maxlongint);
 66  exit(ans);
 67 end;
 68 
 69 begin
 70  assign(input,'bzoj1280.in'); reset(input);
 71  assign(output,'bzoj1280.out'); rewrite(output);
 72  readln(m,n);
 73  for i:=1 to m do read(a[i]);
 74  for i:=1 to 110000 do
 75   if i and 1=1 then fan[i]:=i+1
 76    else fan[i]:=i-1;
 77  source:=n+1; src:=n+2; s:=n+2;
 78  for i:=1 to n do
 79  begin
 80   read(x);
 81   for j:=1 to x do
 82   begin
 83    read(y);
 84    if last[y]=0 then
 85    begin
 86     add(source,i,a[y]);
 87     last[y]:=i;
 88    end
 89     else
 90     begin
 91      add(last[y],i,maxlongint);
 92      last[y]:=i;
 93     end;
 94   end;
 95   read(z);
 96   add(i,src,z);
 97  end;
 98  writeln(maxflow);
 99  close(input);
100  close(output);
101 end.

 


推荐阅读
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了如何使用Python正则表达式匹配MATLAB的函数语法,包括多行匹配和跨行签名的处理方法。同时,作者还分享了自己遇到的问题和解决方案。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了汉诺塔问题的迭代算法实现,通过递归的方式将盘子从一个地方搬到另一个地方,并打印出移动的顺序。详细介绍了算法的思路和步骤,以及示例代码的运行结果。 ... [详细]
author-avatar
mobiledu2502927267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有