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;