BZOJ 2879 美食节(费用流-动态加边)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2879
题意:有n道菜,每道菜需要b[i]份,m个厨师,第j个厨师做第i道菜需要时间a[i][j],求做完所有菜,所有人等待的最小总时间。
思路:设所有的菜为sum。一个明显的思路是将每个厨师拆成sum个点。然后sum个菜每个菜向每个厨师的每个点连边,表示该道菜为该厨师第几个做。由于这样数据太大。动态加边。每次增光一次后找到此次增广的厨师,每道菜将其连边。
- struct node
- {
- int u,v,next,cost,cap;
- };
- node edges[N*5];
- int head[N],e;
- void add(int u,int v,int cap,int cost)
- {
- e++;
- edges[e].u=u;
- edges[e].v=v;
- edges[e].cap=cap;
- edges[e].cost=cost;
- edges[e].next=head[u];
- head[u]=e;
- }
- void Add(int u,int v,int cap,int cost)
- {
- add(u,v,cap,cost);
- add(v,u,0,-cost);
- }
- int pre[N],F[N],C[N],visit[N];
- int SPFA(int s,int t,int n)
- {
- int i;
- for(i=0;i<=n;i++) F[i]=0,C[i]=INF,visit[i]=0;
- queue<int> Q;
- Q.push(s); F[s]=INF; C[s]=0;
- int u,v,cost,cap;
- while(!Q.empty())
- {
- u=Q.front();
- Q.pop();
- visit[u]=0;
- for(i=head[u];i;i=edges[i].next)
- {
- if(edges[i].cap>0)
- {
- v=edges[i].v;
- cost=edges[i].cost;
- cap=edges[i].cap;
- if(C[v]>C[u]+cost)
- {
- C[v]=C[u]+cost;
- F[v]=min(F[u],cap);
- pre[v]=i;
- if(!visit[v]) visit[v]=1,Q.push(v);
- }
- }
- }
- }
- return F[t];
- }
- int s,t,n,m,a[55][105],b[105],cnt[105],last[105];
- int main()
- {
- RD(n,m);
- int sum=0,i,j,x;
- FOR1(i,n) RD(b[i]),sum+=b[i];
- e=1;
- s=0; t=n+m+sum+1;
- FOR1(i,n)
- {
- Add(s,i,b[i],0);
- FOR1(j,m)
- {
- RD(a[i][j]);
- Add(i,n+j,1,a[i][j]);
- }
- }
- FOR1(i,m)
- {
- cnt[i]=1;
- Add(n+i,t,1,0);
- last[i]=e;
- }
- int ans=0,temp;
- while(sum--)
- {
- temp=SPFA(s,t,t);
- for(i=t;i!=s;i=edges[pre[i]].u)
- {
- x=pre[i];
- ans+=temp*edges[x].cost;
- edges[x].cap-=temp;
- edges[x^1].cap+=temp;
- }
- for(j=1;j<=m&&edges[last[j]-1].cap;j++);
- cnt[j]++;
- FOR1(i,n) Add(i,n+m+sum,1,a[i][j]*cnt[j]);
- Add(n+m+sum,t,1,0);
- last[j]=e;
- }
- PR(ans);
- }
BZOJ 2879 美食节(费用流-动态加边)的更多相关文章
- BZOJ 2879: [Noi2012]美食节( 费用流 + 动态加边 )
倒着做菜..然后考虑为当前的人做菜对后面的人的影响就可以了..要动态加边 --------------------------------------------------------------- ...
- 【bzoj2879】[Noi2012]美食节 费用流+动态加边
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他 ...
- [BZOJ2879] [Noi2012] 美食节 (费用流 & 动态加边)
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
- [NOI2012][bzoj2879] 美食节 [费用流+动态加边]
题面 传送门 思路 先看看这道题 修车 仔细理解一下,这两道题是不是一样的? 这道题的不同之处 但是有一个区别:本题中每一种车有多个需求,但是这个好办,连边的时候容量涨成$p\lbrack i\rbr ...
- [BZOJ1070] [SCOI2007] 修车 (费用流 & 动态加边)
Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...
- BZOJ 2879 [Noi2012]美食节 | 费用流 动态开点
这道题就是"修车"的数据加强版--但是数据范围扩大了好多,应对方法是"动态开点". 首先先把"所有厨师做的倒数第一道菜"和所有菜连边,然后跑 ...
- [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
- 【BZOJ 2879】[Noi2012]美食节 费用流
思路同修车,就是多了一个骚气的操作:动态加边,我们通过spfa流的过程可以知道,我们一次只会跑一流量,最后一层边跑过就不会再悔改,所以说我们只会用到一大片里面的很少的点,所以我们如果可以动态加边的话我 ...
- [NOI2012]美食节(费用流)
题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...
随机推荐
- struts2中的addActionError 、addFieldError、addActionMessage的方法
一 addActionError ①概念addActionError是Action级别的错误消息 ②添加this.addActionError("错误信息"); ③显示<s: ...
- For 循环嵌套 0309
For ...
- [OrangePi] Installation on SD Card
Download any of the available images (xz archive) from Mega or GoogleDrive Download scriptbin_kernel ...
- CentOS:安装桌面GNOME图形化界面
u盘安装dvd版的CentOS7后,没有桌面,浏览器也是黑框版的:如果需要桌面的话,下面三条命令即可:但是安装桌面后,系统会没有之前纯净: 1 安装Gnome包: sudo yum groupinst ...
- ios7下不能录音问题解决
在ios6上运行非常正常的AVAudioRecoder组件,而跑到ios7上就不能工作了.通过google搜索在stackoverflow上的解决方法.http://stackoverflow.com ...
- Pascal's Triangle
class Solution { public: vector<vector<int>> generate(int numRows) { vector<vector< ...
- 在centos6.5-64bit上安装wxHexEditor,以查看编译二进制文件
目前在做一个存储,磁盘里面的数据老是出现很诡异的地方,某个通道的录像播放到一半的时候,切换到另外一个通道的视频上去了,一直不知道怎么下手,想着用十六进制编辑器查看磁盘数据. sudo yum inst ...
- 做一个MVC4的项目时留下的经验--增加IPrange
/* CR#1796870 modify by v-yangwu, add a js file to control the page controls. */ $(document).ready(f ...
- HDU 4453:Looploop(Splay各种操作)
http://acm.hdu.edu.cn/showproblem.php?pid=4453 题意:很多种操作:1.add x,将从光标起的 k2 个数全部加上 x:2.reverse,将从光标起的 ...
- ACM第四站————最小生成树(普里姆算法)
对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...