| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
TLE了???求解释。。贴codespfa求最小费用流
边用过之后变成反向负费用流
spfa两次后输出。
var
bb:boolean;
g,c:array[1..1004,0..1004] of longint;
father,fatherc:array[1..1004] of longint;
v:array[1..1004] of boolean;
d,q:array[1..1004] of longint;
cost,maxflow,n,m,i,j,k,x,y,z,head,tail,s,t,lin:longint;
procedure spfa(s:longint);
begin
for i:=1 to n do
d[i]:=maxlongint;
d[s]:=0;
head:=0;
tail:=1;
q[1]:=s;
fillchar(v,sizeof(v),false);
v[s]:=true;
repeat
head:=head mod 1000+1;
k:=q[head];
for i:=1 to g[k,0] do
if d[g[k,i]]-c[k,i]>d[k] then
begin
d[g[k,i]]:=d[k]+c[k,i];
father[g[k,i]]:=k;
fatherc[g[k,i]]:=i;
if not v[g[k,i]] then
inc(tail);
q[tail]:=g[k,i];
v[g[k,i]]:=true;
end;
v[k]:=false;
until head=tail;
end;
begin
readln(n,m);
lin:=0;
fillchar(g,sizeof(g),0);
fillchar(c,sizeof(c),0);
for i:=1 to m do
begin
readln(x,y,z);
inc(g[x+1,0]);
g[x+1,g[x+1,0]]:=y+1;
c[x+1,g[x+1,0]]:=z;
inc(g[y+1,0]);
g[y+1,g[y+1,0]]:=x+1;
c[y+1,g[y+1,0]]:=z;
end;
g[1,0]:=1;
g[1,1]:=2;
c[1,1]:=0;
inc(n,2);
inc(g[n-1,0]);
g[n-1,g[n-1,0]]:=n;
c[n-1,g[n-1,0]]:=0;
s:=1;
t:=n;
bb:=false;
cost:=0;
repeat
spfa(s);
cost:=cost+d[t];
x:=father[t];
y:=t;
repeat
if (x<>s) and (y<>t) then
begin
c[x,fatherc[y]]:=maxlongint;
for i:=1 to g[y,0] do
if g[y,i]=x then
c[y,i]:=-c[y,i];
end
else
begin
inc(lin);
if lin=2 then
begin
writeln(cost);
halt;
end;
end;
y:=x;
x:=father[x];
until x=s;
until bb;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator