Sap算法模版
来源:互联网 发布:简易编程软件 编辑:程序博客网 时间:2024/06/06 19:27
{<sap><O(N*N*M)>}const maxn=300;var{data of sap} n:longint; map:array[1..maxn,1..maxn] of longint; vh,dis,di,pre,his:array[0..maxn] of longint;{function of sap}function flow(s,t:longint):longint;var i,j,j1,min,aug,tmp:longint; flag:boolean;begin for i:=1 to n do begin dis[i]:=0; di[i]:=1; vh[i]:=0; end; vh[0]:=n; i:=s; aug:=maxlongint; flow:=0; while dis[s]<n do begin his[i]:=aug; flag:=false; for j:=di[i] to n do if (map[i,j]>0)and(dis[i]=dis[j]+1) then begin flag:=true; if map[i,j]<aug then aug:=map[i,j]; pre[j]:=i; i:=j; if i=t then begin inc(flow,aug); while i<>s do begin tmp:=i; i:=pre[i]; dec(map[i,tmp],aug); inc(map[tmp,i],aug); end; aug:=maxlongint; end; break; end; if flag then continue; min:=n-1; for j:=1 to n do if (map[i,j]>0)and(dis[j]<min) then begin j1:=j; min:=dis[j]; 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]; aug:=his[i]; end; end;end;