第26章 最大流

2021-07-12 05:46:05 字數 2088 閱讀 8658

一:流網路

流網路g=(v,e)是乙個有向圖,圖中每條邊(u,v)有乙個非負的容量值c(

u,v)

≥0。而且如果邊集合e包含一條邊(u,v),則圖中不存在反方向的邊(v,u)。如果邊(u,v)不屬於e,則定義c(u,v)=0,並且圖中不允許自迴圈。在流網路的所有結點中,我們特別分別出兩個特殊結點,源結點s和匯點t,為方便起見,假定每個結點都在從源點到匯點的某條路徑上。

我們現在可以給出流的形式化定義。假設g=(v,e)為乙個流網路,其容量函式為c。假設s為源結點,t為匯點。圖中任意邊(u,v)的流是乙個實值f(u,v),其滿足下面兩個性質

1:容量限制:對於所有的結點u和v,要求0≤

f(u,

v)≤c

(u,v

) 。

2:流量守恆:對於屬於集合v-的所有結點u來說,要求∑v

∈vf(

v,u)

=∑v∈

vf(u

,v) 。當(u

,v)∉

e 時,從結點u到結點v之間沒有流,因此f(u,v)=0;

我們稱非負數值f(u,v)為從結點u到結點v的流。乙個流f的值|f|定義如下:|f

|=∑v

∈vf(

s,v)

−∑v∈

vf(v

,s)

也就是說,流f的值是從源結點流出的總流量減去流入源結點的總流量。在最大流問題中,給定乙個流網路g,乙個源結點s和乙個匯點t,我們希望找到值最大的乙個流。

二:ford-fulkerson方法

ford-fulkerson方法迴圈增加流的值。在開始的時候,對於所有的結點u,

v∈v , f(u,v)=0,給出的初始流值為0。在每一次迭代中,我們將圖g的流值進行增加,方法就是在乙個關聯的「殘存網路」gf

中尋找一條「增廣路徑」。一旦知道殘存網路中一條增廣路徑的邊,就可以很容易辨別出g中的一些具體的邊,我們可以對這些邊上的流量進行修改,從而增加流的值。雖然ford-fulkerson方法的每次迭代都增加流的值,但是對於圖g的一條特定邊來說,其流量可能增加,也可能減少;對某些邊的流進行縮減可能是必要的,以便讓演算法可以將更多的流從源結點傳送到匯點。重複對流進行這一過程,直到殘存網路中不再存在增廣路徑為止,這時候會獲得乙個最大流。

在殘存網路中尋找增廣路徑的方法有很多種,下面的**是用廣度優先搜尋尋找增廣路徑。**如下:

//求從源點source到匯點sink的最大流量

double ford_fulkerson_bfs(const

vector

>& graph,const

vector

>& capacity,int source,int sink)

if(c[vertex][last_vertex]!=0)

else

vertex=last_vertex;

}pred=bfs(residual_network,source);

}print_edge_flow_value(graph,c); //輸出從源點到匯點的最大流值在圖中每條邊的分配;

return max_flow;

}//上述**中的residual_capacity(),add_edge(),remove_edge(),print_edge_flow_value()**如下:

//殘餘網路的一條增廣路徑能夠為每條邊增加的流量的最大值,也就是增廣路徑所有邊中容量的最小值;

double residual_capacity(const

vector

& pred,const

vector

>& capacity,int sink)

void remove_edge(vector

>& graph,int u,int v)

void add_edge(vector

>& graph,int u,int v)

void print_edge_flow_value(const

vector

>& graph,const

vector

>& residual_network_capacity)

}

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

模板 網路最大流 最大流

給出乙個網路圖,以及其源點和匯點,求出其網路最大流。in put role presentation inp utin put4 5 4 3 4 2 30 4 3 20 2 3 20 2 1 30 1 3 40ou tput role presentation out puto utpu t50最大...

022 第26章 享元模式

簡述 享元模式 運用共享技術有效地支援大量細粒度的物件。享元模式包括 享元工廠類 享元介面類 具體享元類 享元工廠類 用來建立並管理享元介面類物件,它主要使用來確保合理地共享享元介面類,當使用者請求乙個享元介面類物件時,享元工廠類物件提供乙個已建立的例項或者建立乙個 不存在的話 享元介面類 所有具體...