2245: [SDOI2011]工作安排
2013-05-08 19:59
363 查看
因为题目太长懒得看,所以现在才做这道题。
每加工一个零件就花费固定的费用,一看就是费用流。
建立S,T。 S向每个人连边,每一段怒气连一条流量为这一段零件数的边。 如果i可以加工j,add(i,j,inf,0)。每种零件向T连流量为个数的边。
zkw或spfa费用流都行。
因为w是递增的所以才能这么建边。
View Code
每加工一个零件就花费固定的费用,一看就是费用流。
建立S,T。 S向每个人连边,每一段怒气连一条流量为这一段零件数的边。 如果i可以加工j,add(i,j,inf,0)。每种零件向T连流量为个数的边。
zkw或spfa费用流都行。
因为w是递增的所以才能这么建边。
RunID | User | Problem | Result | Memory | Time | Language | Code_Length | Submit_Time |
408065 | lbz007 | 2245 | Accepted | 43300 kb | 3188 ms | Pascal/Edit | 2434 B | 2013-05-08 17:19:07 |
const inf=1000000000; var dis,tx,other,a,pre,next,head,e,x,long,w:array[0..500100]of int64; v:Array[0..100010]of boolean; can,kk,xx,tt,ee,ss,i,j,n,m:longint; sum,ans,mincost:int64; function min(aa,bb:longint):longint; begin if aa>bb then exit(bb) else exit(aa); end; procedure add(u,v,c,cc:longint); begin inc(ee);x[ee]:=u;e[ee]:=v;long[ee]:=c;w[ee]:=cc;other[ee]:=ee+1; next[ee]:=head[u];head[u]:=ee; inc(ee);x[ee]:=v;e[ee]:=u;long[ee]:=0;w[ee]:=-cc;other[ee]:=ee-1; next[ee]:=head[v];head[v]:=ee; end; function spfa :boolean; var i,h,t,j:longint; begin h:=1;t:=1; for i:=ss to tt do dis[i]:=inf; a[1]:=ss; pre[ss]:=-1; v[ss]:=true; dis[ss]:=0; while h<=t do begin j:=head[a[h]]; while j<>0 do begin if (long[j]>0)and(dis[a[h]]+w[j]<dis[e[j]]) then begin dis[e[j]]:=dis[a[h]]+w[j]; pre[e[j]]:=j; if not v[e[j]] then begin v[e[j]]:=true; inc(t) ;a[t]:=e[j]; end; end; j:=next[j]; end; v[a[h]]:=false; inc(h); end; if dis[tt]>=inf-1000 then exit(false) else exit(true); end; procedure work; var zh,flow:longint; begin ans:=0; mincost:=0; while spfa do begin zh:=tt; flow:=maxlongint; while pre[zh]<>-1 do begin flow:=min(flow,long[pre[zh]]); zh:=x[pre[zh]]; end; ans:=ans+flow; mincost:=mincost+dis[tt]*flow; zh:=tt; while pre[zh]<>-1 do begin dec(long[pre[zh]],flow); inc(long[other[pre[zh]]],flow); zh:=x[pre[zh]]; end; end; end; begin readln(n,m); tt:=n+m+1;ss:=0; for i:=1 to m do begin read(xx);sum:=sum+xx; add(n+i,tt,xx,0); end; for i:=1 to n do begin for j:=1 to m do begin read(can); if can=1 then add(i,n+j,inf,0); end; readln; end; for i:=1 to n do begin readln(kk); for j:=1 to kk do read(tx[j]); tx[kk+1]:=sum; for j:=1 to kk+1 do begin read(xx); add(ss,i,tx[j]-tx[j-1],xx); end; end; work; writeln(mincost); end.
相关文章推荐
- Bzoj 2245: [SDOI2011]工作安排(费用流)
- 2245: [SDOI2011]工作安排 (最小费用最大流)
- 【费用流】【bzoj 2245】: [SDOI2011]工作安排
- 2245: [SDOI2011]工作安排
- BZOJ 2245: [SDOI2011]工作安排
- BZOJ 2245 SDOI 2011 工作安排 费用流
- BZOJ 2245: [SDOI2011]工作安排( 费用流 )
- 【BZOJ 2245】[SDOI2011]工作安排
- bzoj 2245: [SDOI2011]工作安排
- 2245: [SDOI2011]工作安排 费用流
- 【BZOJ】【2245】【SDOI2011】工作安排
- bzoj 2245: [SDOI2011]工作安排(费用流)
- bzoj 2245 [SDOI2011]工作安排(最小费用最大流)
- bzoj2245 [SDOI2011]工作安排
- bzoj 2245 [SDOI2011]工作安排【最小费用最大流】
- BZOJ 2245 SDOI 2011 工作安排 费用流
- 2245: [SDOI2011]工作安排|费用流
- bzoj 2245 [SDOI2011]工作安排(最小费用最大流)
- bzoj2245 [SDOI2011]工作安排(费用流)
- [bzoj2245][SDOI2011] 工作安排 费用流