无题目
该算法就是不断在残余网络中寻找增广路并增广,直到找不到增广路为止(也就是说,此时源点和汇点不连通,存在割)。下面给出增广路和增广的含义。
算法实现const
maxn=200;
var
c:array[1..maxn,1..maxn] of longint;
b:array[1..maxn] of longint;
sum,s,t,n,m:longint;
function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end;
function findflow(k:longint):boolean;
var
i:longint;
begin
if k=t then exit(true);
for i:=1 to n do
if (b[i]=-1) and (c[k,i]>0)
then begin
b[i]:=k;
if findflow(i) then exit(true);
end;
exit(false);
end;
procedure addflow;
var
i,d:longint;
begin
d:=maxlongint;
i:=t;
while b[i]<>0 do
begin
if c[b[i],i]>0 then d:=min(d,c[b[i],i]);
i:=b[i];
end;
i:=t;
while b[i]<>0 do
begin
dec(c[b[i],i],d);
inc(c[i,b[i]],d);
i:=b[i];
end;
inc(sum,d);
end;
procedure init;
var
i,x,y,w:longint;
begin
readln(m,n);
s:=1;t:=n;
for i:=1 to m do
begin
readln(x,y,w);
inc(c[x,y],w);
end;
end;
procedure main;
var
i,j:Longint;
begin
for i:=1 to n do b[i]:=-1;
b[s]:=0;
whilefindflow(s) do
begin
addflow;
for i:=1 to n do b[i]:=-1;
b[s]:=0;
end;
end;
procedure print;
var
i,j:longint;
begin
writeln(sum);
end;
begin
init;
main;
print;
end.