您的位置:首页 > 其它

2245: [SDOI2011]工作安排

2013-05-08 19:59 363 查看
因为题目太长懒得看,所以现在才做这道题。

每加工一个零件就花费固定的费用,一看就是费用流。

建立S,T。 S向每个人连边,每一段怒气连一条流量为这一段零件数的边。 如果i可以加工j,add(i,j,inf,0)。每种零件向T连流量为个数的边。

zkw或spfa费用流都行。

因为w是递增的所以才能这么建边。

RunIDUserProblemResultMemoryTimeLanguageCode_LengthSubmit_Time
408065lbz0072245Accepted43300 kb3188 msPascal/Edit2434 B2013-05-08 17:19:07
View Code

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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: