program ditch;
type int=cardinal;
bool=boolean;
var c:array[0..200,0..200] of int;
h,vh:array[0..200] of int;
n,augc,rd1,rd2,m,i:int;
flow:int=0;
found:bool;
procedure aug(const m:int);
var i,augco,minh:int;
begin
minh:=n-1;
augco:=augc;
if m=n then
begin
found:=true;
inc(flow,augc);
exit;
end;
for i:=1 to n do
if c[m,i]>0 then
begin
if h+1=h[m] then
begin
if c[m,i]<augc then augc:=c[m,i];
aug(i);
if h[1]>=n then exit;
if found then break;
augc:=augco;
end;
if h<minh then minh:=h;
end;
if not found then
begin
dec(vh[h[m]]);
if vh[h[m]]=0 then h[1]:=n;
h[m]:=minh+1;
inc(vh[h[m]]);
end
else begin
dec(c[m,i],augc);
inc(c[i,m],augc);
end;
end;
begin
readln(m,n);
fillchar(c,sizeof(c),0);
for i:=1 to m do
begin
readln(rd1,rd2,augc);
inc(c[rd1,rd2],augc);
end;
fillchar(h,sizeof(h),0);
fillchar(vh,sizeof(vh),0);
vh[0]:=n;
while h[1]<n do
begin
augc:=$FFFFFFFF;
found:=false;
aug(1);
end;
writeln(flow);
end.
MaxFlow SAP算法 封装后模板
最新推荐文章于 2024-05-27 09:55:18 发布