增广路算法Ford-Fulkerson

无题目

该算法就是不断在残余网络中寻找增广路增广,直到找不到增广路为止(也就是说,此时源点和汇点不连通,存在割)。下面给出增广路和增广的含义。

算法实现

const

 maxn=200;

var

 c:array[1..maxn,1..maxn] of longint;

 b:array[1..maxn] of longint;

 sum,s,t,n,m:longint;

 

function min(a,b:longint):longint;

begin

   if a>b then exit(b) else exit(a);

end;

 

function findflow(k:longint):boolean;

var

 i:longint;

begin

  if k=t then exit(true);

  for i:=1 to n do

   if (b[i]=-1) and (c[k,i]>0)

     then begin

            b[i]:=k;

            if findflow(i) then exit(true);

          end;

 exit(false);

end;

 

procedure addflow;

var

 i,d:longint;

begin

 d:=maxlongint;

 i:=t;

 while b[i]<>0 do

   begin

     if c[b[i],i]>0 then d:=min(d,c[b[i],i]);

     i:=b[i];

   end;

 i:=t;

 while b[i]<>0 do

   begin

     dec(c[b[i],i],d);

     inc(c[i,b[i]],d);

     i:=b[i];

   end;

 inc(sum,d);

end;

 

procedure init;

var

 i,x,y,w:longint;

begin

 readln(m,n);

 s:=1;t:=n;

  for i:=1 to m do

   begin

      readln(x,y,w);

      inc(c[x,y],w);

   end;

end;

 

procedure main;

var

 i,j:Longint;

begin

  for i:=1 to n do b[i]:=-1;

 b[s]:=0;

  whilefindflow(s) do

    begin

      addflow;

      for i:=1 to n do b[i]:=-1;

      b[s]:=0;

    end;

end;

 

procedure print;

var

 i,j:longint;

begin

 writeln(sum);

end;

 

begin

  init;

  main;

  print;

end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值