增廣路演算法Ford Fulkerson

2021-07-25 13:07:57 字數 1656 閱讀 8073

無題目

該演算法就是不斷在殘餘網路中尋找增廣路

增廣

,直到找不到增廣路為止(也就是說,此時源點和匯點不連通,存在割)。下面給出增廣路和增廣的含義。

演算法實現

const

maxn=200;

varc: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;

vari: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;

vari,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;

vari,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;

vari,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;

vari,j:longint;

begin

writeln(sum);

end;

begin

init;

main;

print;

end.

增廣路演算法入門

增廣路定理 我們用未覆蓋點來表示不與任何匹配邊鄰接的點,其他點為匹配點,即恰好和一條匹配邊鄰接的點。從未覆蓋點出發,依次經過非匹配邊,匹配邊,非匹配邊,匹配邊 所得的路稱為交替路。如果交替路的終點是乙個未覆蓋點,則稱這條交替路為一條增廣路,非匹配邊比匹配邊多一條。增廣路的作用是改進匹配,假設我們已經...

最大流的增廣路演算法

模板題目鏈結 洛谷p3376 模板來自演算法競賽入門經典 第2版 劉汝佳 include using namespace std define inf 0x3f3f3f3f typedef long long ll const int maxn 100010 struct edge 記錄這條邊的資訊...

網路流之增廣路演算法

這部分內容在 演算法競賽入門經典 劉汝佳 裡面講的已經很詳細了。但裡面對於反向流量的作用是沒有說明的。這裡只說一下反向流量的作用。推薦上看下。反向流量能夠讓後面的流自我調整。例如當前狀態下 當前狀態下如何尋找?用a表示殘量,cap表示容量,很明顯,3 4這條路不是最優的.更新流量得到 可以看到,通過...