网络流/费用流


  跟 BZOJ 1070 修车 几乎是一道题,只是这题“要修的车”(即菜)多了很多……几乎是从$n$变成了$n^2$,所以建图的时候就得动态加点……

  也就是说,当一个厨师已经确定了他的后k道菜的时候,再加入表示倒数第k+1道菜的节点。

  我个xx一开始写成了每次加一层……不 T 才怪……

  加点过程看min_cost_flow(即mcf)这个函数吧,每次通过找流过来的节点,来确定要加的点。

  1. /**************************************************************
  2. Problem: 2879
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:7416 ms
  7. Memory:72872 kb
  8. ****************************************************************/
  9.  
  10. //BZOJ 2879
  11. #include<cmath>
  12. #include<vector>
  13. #include<cstdio>
  14. #include<cstring>
  15. #include<cstdlib>
  16. #include<iostream>
  17. #include<algorithm>
  18. #define rep(i,n) for(int i=0;i<n;++i)
  19. #define F(i,j,n) for(int i=j;i<=n;++i)
  20. #define D(i,j,n) for(int i=j;i>=n;--i)
  21. #define pb push_back
  22. #define CC(a,b) memset(a,b,sizeof(a))
  23. using namespace std;
  24. int getint(){
  25. int v=,sign=; char ch=getchar();
  26. while(!isdigit(ch)) {if(ch=='-') sign=-; ch=getchar();}
  27. while(isdigit(ch)) {v=v*+ch-''; ch=getchar();}
  28. return v*sign;
  29. }
  30. const int N=,M=,INF=~0u>>;
  31. const double eps=1e-;
  32. /*******************template********************/
  33. int n,m,ans,tot,tim[][],p[];
  34. struct edge{int from,to,v,c;};
  35. struct Net{
  36. edge E[M];
  37. int head[N],next[M],cnt;
  38. void ins(int x,int y,int z,int c){
  39. E[++cnt]=(edge){x,y,z,c};
  40. next[cnt]=head[x]; head[x]=cnt;
  41. }
  42. void add(int x,int y,int z,int c){
  43. ins(x,y,z,c); ins(y,x,,-c);
  44. }
  45. int from[N],Q[M],d[N],S,T,ed;
  46. bool inq[N],sign;
  47. bool spfa(){
  48. int l=,r=-;
  49. F(i,,T) d[i]=INF;
  50. d[S]=; Q[++r]=S; inq[S]=;
  51. while(l<=r){
  52. int x=Q[l++];
  53. inq[x]=;
  54. for(int i=head[x];i;i=next[i])
  55. if(E[i].v> && d[x]+E[i].c<d[E[i].to]){
  56. d[E[i].to]=d[x]+E[i].c;
  57. from[E[i].to]=i;
  58. if (!inq[E[i].to]){
  59. Q[++r]=E[i].to;
  60. inq[E[i].to]=;
  61. }
  62. }
  63. }
  64. return d[T]!=INF;
  65. }
  66. void mcf(){
  67. int x=INF,a,b;
  68. for(int i=from[T];i;i=from[E[i].from]){
  69. x=min(x,E[i].v);
  70. if (E[i].to==T){
  71. a=E[i].from%tot+;
  72. b=(E[i].from-)/tot;
  73. }
  74. }
  75. for(int i=from[T];i;i=from[E[i].from]){
  76. E[i].v-=x;
  77. E[i^].v+=x;
  78. }
  79. ans+=x*d[T];
  80. if (a!=)
  81. F(i,,n)
  82. add(i,b*tot+a,,a*tim[i][b]);
  83. }
  84. void init(){
  85. n=getint(); m=getint(); cnt=ed=; tot=;
  86. F(i,,n) {p[i]=getint(); tot+=p[i];}
  87. S=; T=tot+tot*m+;
  88. F(i,,n) F(j,,m) tim[i][j]=getint();
  89. F(i,,n) add(S,i,p[i],);
  90. F(i,tot+,tot+tot*m) add(i,T,,);
  91. F(i,,n)
  92. F(j,,m)
  93. add(i,j*tot+,,tim[i][j]);
  94. ans=;
  95. while(spfa()) mcf();
  96. printf("%d\n",ans);
  97. }
  98. }G1;
  99. int main(){
  100. #ifndef ONLINE_JUDGE
  101. freopen("2879.in","r",stdin);
  102. freopen("2879.out","w",stdout);
  103. #endif
  104. G1.init();
  105. return ;
  106. }

【BZOJ】【2879】【NOI2012】美食节的更多相关文章

  1. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  2. BZOJ 2879: [Noi2012]美食节 最小费用流 动态添边

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 324  Solved: 179[Submit][Status] ...

  3. BZOJ 2879: [Noi2012]美食节( 费用流 + 动态加边 )

    倒着做菜..然后考虑为当前的人做菜对后面的人的影响就可以了..要动态加边 --------------------------------------------------------------- ...

  4. BZOJ 2879 NOI2012美食节

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2879 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M ...

  5. BZOJ.2879.[NOI2012]美食节(费用流SPFA)

    题目链接 /* 同"修车":对于每个厨师拆成p个点表示p个时间点,每个人向m个厨师每个时间点连边 这样边数O(nmp)+网络流 ≈O(nm*p^2)(假设SPFA线性) = GG ...

  6. BZOJ 2879 [Noi2012]美食节 | 费用流 动态开点

    这道题就是"修车"的数据加强版--但是数据范围扩大了好多,应对方法是"动态开点". 首先先把"所有厨师做的倒数第一道菜"和所有菜连边,然后跑 ...

  7. 2879: [Noi2012]美食节 - BZOJ

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  8. 【BZOJ】2879: [Noi2012]美食节

    题意 \(m\)个厨师,\(n\)种菜,每种菜需要做\(p_i\)份,每个厨师做第\(i\)种菜用时\(t_{i, j}\).一个厨师做完一道菜才能做下一道.每份菜的时间是这个厨师做完这道菜的用时加上 ...

  9. 2879: [Noi2012]美食节

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

  10. 2879. [NOI2012]美食节【费用流】

    Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...

随机推荐

  1. PHP JS判断浏览器,微信浏览器

      微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是: Mo ...

  2. SQL语句新建表,同时添加主键、索引、约束

    SQL语句新建数据表   主键,索引,约束 CREATE TABLE [dbo].[T_SendInsideMessageRec]( [SendInsideMID] [uniqueidentifier ...

  3. 20141128—JavaScript对象

    JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... String 对象的 length 属性来获得字符串的长度: var message="Hello World!& ...

  4. 《HTML5与CSS3基础教程》学习笔记 ——One Day

    第一章 1.    邮箱地址的URL地址包括:mailto:+邮箱地址 2.    ../表示向上走一级,开头直接使用/表示根目录 第三章 1.    <header>: role = “ ...

  5. Essential C++ 学习笔记02--Array/Vector 与指针

    Essential C++ 1.5-1.6节,3.1节笔记 Array/Vector/指针,难度偏大, 但若学习初期不熟悉基本用法,则难以写出有效代码. 1. 基本概念 Array 是一段连续内存,数 ...

  6. 通过Driver获取数据库连接

    先看一下文件,在当前包下有一个properties配置文件,在根目录下有一个lib文件夹,里面放的是mySql的驱动jar包 Driver :是一个接口,数据库厂商必须提供实现的接口,能从其中获取数据 ...

  7. 图片剪裁上传插件 - cropper

    图片剪裁上传插件 - cropper <style> .photo-container{float: left;width: 300px;height: 300px;} .photo-co ...

  8. 京东sdk商家上架接口调用问题总结(更新中...)

    前言: 最近在做商家发布产品,调用京东sdk,发现问题很多,而且还是在我同事的帮助下完成的,摸索中,菜鸟还请高手门多多提携才好,入正题 首先是引用jd的sdk啦,京东sdk中发布商品需要调用一个 36 ...

  9. 前端自动化构建工具——gulp

    gulp是基于流的前端自动化构建工具. 一.环境配置 gulp是基于nodejs的,所以没有 nodejs 环境的要先去安装好 然后给系统配上gulp环境 npm install -g gulp 再到 ...

  10. PHP实现链式操作的原理

    在一个类中有多个方法,当你实例化这个类,并调用方法时只能一个一个调用,类似: db.php <?php class db{ public function where() { //code he ...