题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2879

题意:有n道菜,每道菜需要b[i]份,m个厨师,第j个厨师做第i道菜需要时间a[i][j],求做完所有菜,所有人等待的最小总时间。

思路:设所有的菜为sum。一个明显的思路是将每个厨师拆成sum个点。然后sum个菜每个菜向每个厨师的每个点连边,表示该道菜为该厨师第几个做。由于这样数据太大。动态加边。每次增光一次后找到此次增广的厨师,每道菜将其连边。

  1. struct node
  2. {
  3. int u,v,next,cost,cap;
  4. };
  5.  
  6. node edges[N*5];
  7. int head[N],e;
  8.  
  9. void add(int u,int v,int cap,int cost)
  10. {
  11. e++;
  12. edges[e].u=u;
  13. edges[e].v=v;
  14. edges[e].cap=cap;
  15. edges[e].cost=cost;
  16. edges[e].next=head[u];
  17. head[u]=e;
  18. }
  19.  
  20. void Add(int u,int v,int cap,int cost)
  21. {
  22. add(u,v,cap,cost);
  23. add(v,u,0,-cost);
  24. }
  25.  
  26. int pre[N],F[N],C[N],visit[N];
  27.  
  28. int SPFA(int s,int t,int n)
  29. {
  30. int i;
  31. for(i=0;i<=n;i++) F[i]=0,C[i]=INF,visit[i]=0;
  32. queue<int> Q;
  33. Q.push(s); F[s]=INF; C[s]=0;
  34. int u,v,cost,cap;
  35. while(!Q.empty())
  36. {
  37. u=Q.front();
  38. Q.pop();
  39.  
  40. visit[u]=0;
  41. for(i=head[u];i;i=edges[i].next)
  42. {
  43. if(edges[i].cap>0)
  44. {
  45. v=edges[i].v;
  46. cost=edges[i].cost;
  47. cap=edges[i].cap;
  48. if(C[v]>C[u]+cost)
  49. {
  50. C[v]=C[u]+cost;
  51. F[v]=min(F[u],cap);
  52. pre[v]=i;
  53. if(!visit[v]) visit[v]=1,Q.push(v);
  54. }
  55. }
  56. }
  57. }
  58. return F[t];
  59. }
  60.  
  61. int s,t,n,m,a[55][105],b[105],cnt[105],last[105];
  62.  
  63. int main()
  64. {
  65. RD(n,m);
  66. int sum=0,i,j,x;
  67. FOR1(i,n) RD(b[i]),sum+=b[i];
  68. e=1;
  69. s=0; t=n+m+sum+1;
  70. FOR1(i,n)
  71. {
  72. Add(s,i,b[i],0);
  73. FOR1(j,m)
  74. {
  75. RD(a[i][j]);
  76. Add(i,n+j,1,a[i][j]);
  77. }
  78. }
  79. FOR1(i,m)
  80. {
  81. cnt[i]=1;
  82. Add(n+i,t,1,0);
  83. last[i]=e;
  84. }
  85. int ans=0,temp;
  86. while(sum--)
  87. {
  88. temp=SPFA(s,t,t);
  89. for(i=t;i!=s;i=edges[pre[i]].u)
  90. {
  91. x=pre[i];
  92. ans+=temp*edges[x].cost;
  93. edges[x].cap-=temp;
  94. edges[x^1].cap+=temp;
  95. }
  96. for(j=1;j<=m&&edges[last[j]-1].cap;j++);
  97. cnt[j]++;
  98. FOR1(i,n) Add(i,n+m+sum,1,a[i][j]*cnt[j]);
  99. Add(n+m+sum,t,1,0);
  100. last[j]=e;
  101. }
  102. PR(ans);
  103. }

BZOJ 2879 美食节(费用流-动态加边)的更多相关文章

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

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

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

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

  3. [BZOJ2879] [Noi2012] 美食节 (费用流 & 动态加边)

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

  4. [NOI2012][bzoj2879] 美食节 [费用流+动态加边]

    题面 传送门 思路 先看看这道题 修车 仔细理解一下,这两道题是不是一样的? 这道题的不同之处 但是有一个区别:本题中每一种车有多个需求,但是这个好办,连边的时候容量涨成$p\lbrack i\rbr ...

  5. [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...

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

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

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

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

  8. 【BZOJ 2879】[Noi2012]美食节 费用流

    思路同修车,就是多了一个骚气的操作:动态加边,我们通过spfa流的过程可以知道,我们一次只会跑一流量,最后一层边跑过就不会再悔改,所以说我们只会用到一大片里面的很少的点,所以我们如果可以动态加边的话我 ...

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

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

随机推荐

  1. struts2中的addActionError 、addFieldError、addActionMessage的方法

    一 addActionError ①概念addActionError是Action级别的错误消息 ②添加this.addActionError("错误信息"); ③显示<s: ...

  2. For 循环嵌套 0309

                                                                                                     For ...

  3. [OrangePi] Installation on SD Card

    Download any of the available images (xz archive) from Mega or GoogleDrive Download scriptbin_kernel ...

  4. CentOS:安装桌面GNOME图形化界面

    u盘安装dvd版的CentOS7后,没有桌面,浏览器也是黑框版的:如果需要桌面的话,下面三条命令即可:但是安装桌面后,系统会没有之前纯净: 1 安装Gnome包: sudo yum groupinst ...

  5. ios7下不能录音问题解决

    在ios6上运行非常正常的AVAudioRecoder组件,而跑到ios7上就不能工作了.通过google搜索在stackoverflow上的解决方法.http://stackoverflow.com ...

  6. Pascal's Triangle

    class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector< ...

  7. 在centos6.5-64bit上安装wxHexEditor,以查看编译二进制文件

    目前在做一个存储,磁盘里面的数据老是出现很诡异的地方,某个通道的录像播放到一半的时候,切换到另外一个通道的视频上去了,一直不知道怎么下手,想着用十六进制编辑器查看磁盘数据. sudo yum inst ...

  8. 做一个MVC4的项目时留下的经验--增加IPrange

    /* CR#1796870 modify by v-yangwu, add a js file to control the page controls. */ $(document).ready(f ...

  9. HDU 4453:Looploop(Splay各种操作)

    http://acm.hdu.edu.cn/showproblem.php?pid=4453 题意:很多种操作:1.add x,将从光标起的 k2 个数全部加上 x:2.reverse,将从光标起的 ...

  10. ACM第四站————最小生成树(普里姆算法)

    对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...