MaxFlow SAP算法 封装后模板

 
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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值