思路同修车,就是多了一个骚气的操作:动态加边,我们通过spfa流的过程可以知道,我们一次只会跑一流量,最后一层边跑过就不会再悔改,所以说我们只会用到一大片里面的很少的点,所以我们如果可以动态加边的话我们的边的数量就会从n*m*p级别减少到p*n级别,点数的话有些点虽然存在但是由于我们没连上所以就不会有任何用。
这道题告诉我网络流的图并不是静态的他也是可以动态的变化,这道题只是动态得加一些边,还会有什么呢?这道题的动态加边只是为了提高时间效率,还有其他的作用吗?

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. const int N=;
  5. const int M=;
  6. const int P=;
  7. const int O=P*M;
  8. const int E=P*M*N*;
  9. const int Inf=0x3f3f3f3f;
  10. struct V{
  11. int to,next,c,f;
  12. }c[E];
  13. int head[O],t=;
  14. inline void add(int x,int y,int z,int _){
  15. c[++t].to=y,c[t].next=head[x],c[t].f=z,c[t].c=_,head[x]=t;
  16. }
  17. int dis[O],anc[O],p[N];
  18. int q[O],front,back;
  19. bool in[O];
  20. int n,m,sum;
  21. int S,T,ans;
  22. bool link[M][P];
  23. int val[N][M];
  24. #define food(a) (a)
  25. #define cook(a,b) (((a)-1)*sum+(b)+n)
  26. inline bool spfa(){
  27. memset(dis,0x3f,sizeof(dis));
  28. dis[S]=,in[S]=true,q[back++]=S;
  29. if(back==O)back=;
  30. while(front!=back){
  31. int x=q[front++];in[x]=false;
  32. if(front==O)front=;
  33. for(int i=head[x];i;i=c[i].next)
  34. if(c[i].f&&dis[x]+c[i].c<dis[c[i].to]){
  35. dis[c[i].to]=dis[x]+c[i].c,anc[c[i].to]=i;
  36. if(!in[c[i].to]){
  37. q[back++]=c[i].to,in[c[i].to]=true;
  38. if(back==O)back=;
  39. }
  40. }
  41. }
  42. return dis[T]!=Inf;
  43. }
  44. inline int shoot(){
  45. int f=Inf;
  46. for(int i=anc[T];i;i=anc[c[i^].to])f=std::min(f,c[i].f);
  47. for(int i=anc[T];i;i=anc[c[i^].to])c[i].f-=f,c[i^].f+=f;
  48. int key=c[anc[T]^].to-n;
  49. int y=key%sum==?sum:key%sum;
  50. int x=(key-y)/sum+;
  51. if(y!=sum&&link[x][y+]==false){
  52. link[x][y+]=true;
  53. for(int i=;i<=n;++i){
  54. add(food(i),cook(x,y+),,(y+)*val[i][x]);
  55. add(cook(x,y+),food(i),,-(y+)*val[i][x]);
  56. }
  57. add(cook(x,y+),T,,);
  58. add(T,cook(x,y+),,);
  59. }
  60. return f*dis[T];
  61. }
  62. int main(){
  63. scanf("%d%d",&n,&m);
  64. for(int i=;i<=n;++i)
  65. scanf("%d",&p[i]),sum+=p[i];
  66. S=sum*m+n+,T=S+;
  67. for(int i=;i<=n;++i){
  68. add(S,food(i),p[i],);
  69. add(food(i),S,,);
  70. }
  71. for(int i=;i<=m;++i){
  72. add(cook(i,),T,,);
  73. add(T,cook(i,),,);
  74. link[i][]=true;
  75. }
  76. for(int i=,x;i<=n;++i)
  77. for(int j=;j<=m;++j){
  78. scanf("%d",&x);
  79. add(food(i),cook(j,),,x);
  80. add(cook(j,),food(i),,-x);
  81. val[i][j]=x;
  82. }
  83. while(spfa())ans+=shoot();
  84. printf("%d",ans);
  85. return ;
  86. }

【BZOJ 2879】[Noi2012]美食节 费用流的更多相关文章

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

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

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

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

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

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

  4. BZOJ 2879: [Noi2012]美食节

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

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

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

  6. [NOI2012]美食节(费用流)

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

  7. [NOI2012]美食节——费用流(带权二分图匹配)+动态加边

    题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...

  8. 【bzoj2879】[Noi2012]美食节 费用流+动态加边

    原文地址:http://www.cnblogs.com/GXZlegend 题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他 ...

  9. BZOJ 2879 NOI2012美食节

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

随机推荐

  1. Python基础02

    6.变量定义的规则: # 变量,只能由 字母 数字 下划线 特例:不能用数字开头 Python关键字,也不能使用 'and', 'as', 'assert', 'break', 'class', 'c ...

  2. python正则表达式+正则大量实例

    正则表达式 正则表达式内部函数详解http://www.runoob.com/python/python-reg-expressions.html 正则表达式是一个特殊的字符序列,它能帮助你方便的检查 ...

  3. GDOI DAY1游记

    今天,是本蒟蒻的第一次参加GDOI,真激动! 今天,是GDOI第一天,昨天熬夜打代码,今天早上状态十分不好,于是... 进入了考场,叫我们自由打一会代码,于是...打了一坨AC机,重要的是错了(额.. ...

  4. POJ3177 边双连通分量

    Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18580   Accepted: 7711 ...

  5. LeetCode 二叉树的层次遍历 C++

    给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层 ...

  6. 初步学习pg_control文件之三

    接前文,初步学习pg_control文件之二 继续学习: 研究 DBState,先研究 DB_IN_PRODUCTION ,看它如何出现: 它出现在启动Postmaster时运行的函数处: /* * ...

  7. DDD领域驱动设计基本理论知识总结(转)

    领域驱动设计之领域模型 为什么建立一个领域模型是重要的 领域通用语言(UBIQUITOUS LANGUAGE) 将领域模型转换为代码实现的最佳实践 领域建模时思考问题的角度 领域驱动设计的经典分层架构 ...

  8. Python面试315题

    感谢老男孩的武沛齐老师辛苦整理和分享,本文是转自他的博客. 第一部分 Python基础篇(80题) 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C# ...

  9. 如何用Fiddler 拦住RestAssured发出的请求

    用RestAssured 发出的请求并不能直接被fiddler 拦截,可以在初始化的时候做出如下配置: RestAssured.proxy("localhost", 8888); ...

  10. 为Zabbix配置Nova服务、Keystone和Placement进程CPU和内存usage监控

    目前已经完成了RabbitMQ和MySQL的监控项配置,还差对nova-api.nova-conductor.nova-scheduler和keystone进程CPU和内存 usage的监控,类似的轮 ...