之前写的其实不是dinic真不好意思……耽误大家了。现在重写了一个真正的dinic。 2013-05-13
program dinic;
//Algorithm:Dinic for Network
//Author:HT
//Date:2013/05/10
Const
inf=1000000;
Type
rec=record
s,e,w,flow,next:longint;
end;
Var
b,d,q:array[0..300] of longint;
a:array[-1..450] of rec;
v:array[0..300] of boolean;
n,m,i,st,ed,ww,top,tar:longint;
Function min(a,b:longint):longint;inline;begin if a<b then exit(a);exit(b); end;
Procedure Add(st,ed,ww:longint);inline;
begin
inc(top);
with a[top] do begin s:=st; e:=ed;w:=ww;next:=b[st]; end;
b[st]:=top;
end;
function bfs:boolean;
var
head,tail,x,u:longint;
y:rec;
begin
fillchar(v,sizeof(v),false);
tail:=1;head:=0;d[st]:=1;
v[st]:=true;
q[1]:=st;
while head<tail do
begin
inc(head);
x:=q[head];
u:=b[x];
while u<>b[0] do
begin
y:=a[u];
if (not v[y.e]) and (y.flow<y.w) then
begin
v[y.e]:=true;
d[y.e]:=d[x]+1;
inc(tail);
q[tail]:=y.e;
end;
u:=y.next;
end;
end;
exit(v[tar]);
end;
Function Addflow(p,maxflow:longint):longint;
var
u,o:longint;
y:rec;
begin
if (p=tar) or (maxflow=0) then exit(maxflow);
addflow:=0;
u:=b[p];
while u<>b[0] do
begin
y:=a[u];
if (d[y.e]=d[p]+1) and (y.flow<y.w) then
begin
o:=Addflow(y.e,min(maxflow,y.w-y.flow));
if o>0 then
begin
inc(a[u].flow,o);
dec(a[u xor 1].flow,o);
dec(maxflow,o);
inc(addflow,o);
if maxflow=0 then break;
end;
end;
u:=y.next;
end;
end;
function network:longint;
begin
network:=0;
while bfs do
begin
inc(network,addflow(st,inf));
//writeln('network=',network);
end;
end;
begin
while not eof do begin
fillchar(b,sizeof(b),$ff);
fillchar(a,20*(2*m+2),0);
readln(m,n); top:=-1;
for i:=1 to m do
begin
readln(st,ed,ww);
Add(st,ed,ww);
Add(ed,st,0);
end;
st:=1;tar:=n;
writeln(Network); end;
end.