無題目
該演算法就是不斷在殘餘網路中尋找增廣路
並增廣
,直到找不到增廣路為止(也就是說,此時源點和匯點不連通,存在割)。下面給出增廣路和增廣的含義。
演算法實現
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這條路不是最優的.更新流量得到 可以看到,通過...