const
oo=maxlongint;
type
link=^node;
node=record
x,c:longint;
bak,nxt:link;
end;
var
G,di:array[1..55005] of link;
vh,dis,his:array[0..55005] of longint;
pre:array[1..55005] of record id:longint; L:link; end;
function flow(s,t,n:longint):longint;
var i,min,aug:longint; j,j1:link; flag:boolean;
begin
for i:=1 to n do begin
dis[i]:=0;
di[i]:=G[i];
vh[i]:=0;
end; vh[0]:=n;
i:=s; aug:=oo; flow:=0;
while dis[s]<n do begin
his[i]:=aug; flag:=false;
j:=di[i];
while j<>nil do begin
if (j^.c>0)and(dis[i]=dis[j^.x]+1)then begin
flag:=true; di[i]:=j; if j^.c<aug then aug:=j^.c;
pre[j^.x].id:=i; pre[j^.x].L:=j; i:=j^.x;
if i=t then begin
inc(flow,aug);
while i<>s do begin
dec(pre[i].L^.c,aug);
inc(pre[i].L^.bak^.c,aug);
i:=pre[i].id;
end;
end;
break;
end;
j:=j^.nxt;
end;
if flag then continue;
min:=n-1;
j:=G[i];
while j<>nil do begin
if (j^.c>0)and(dis[j^.x]<min) then begin
j1:=j;
min:=dis[j^.x];
end;
j:=j^.nxt;
end;
di[i]:=j1;
dec(vh[dis[i]]); if vh[dis[i]]=0 then break;
dis[i]:=min+1; inc(vh[dis[i]]);
if i<>s then begin i:=pre[i].id; aug:=his[i]; end;
end;
end;
procedure add(s,t,c:longint);
var p:link;
begin
new(p);
p^.x:=t;
p^.c:=c;
p^.nxt:=G[s];
G[s]:=p;
new(p);
p^.x:=s;
p^.c:=0;
p^.nxt:=G[t];
G[t]:=p;
G[s]^.bak:=G[t];
G[t]^.bak:=G[s];
end;
sap!!!
最新推荐文章于 2020-04-27 19:37:55 发布