最大流問題

2021-08-17 15:17:26 字數 1404 閱讀 5868

具體的最大流問題定義、術語以及特性,前人已經描述的很詳細了:

我們需要注意以及幾個方面:

增益路徑的生成次序如果不恰當,會對方法的效率有巨大的影響。如下:其中u代表某個大正整數。如果沿著路徑1→2→3→4對流量0進行增益,得到(b)中值為1的流量;接著沿著路徑1→3←2→4對流量0進行增益,得到(c)中值為2的流量。按照上述繼續增益,需要2u次迭代才能得到最大的流量值2u。但是,如果沿著路徑1→2→4和路徑1→3→4增益u僅需要2次迭代。2u和2的巨大差異說明選擇高效方法的重要性。

也加先標記先掃瞄演算法。其思想就是按照廣度優先查詢,用數量最少的邊來生成增益路徑。

時間複雜度:證明了增益路徑的數量不會超過nm / 2,其中,n和m分別是頂點和邊的數量。用鄰接矩陣,廣度優先演算法求一條增益路徑的時間屬於o(n+m) = o(m),最短增益路徑演算法的時間效率屬於o(nm

2 2

)。偽**——>

shortestaugmentingpath(g)//最短增益路徑演算法的實現

輸入:網路g,具有乙個源點1和乙個匯點你,每條邊(i,j)的容量都是正整數uij

輸出:最大流量x

對網路中的每條邊(i,j),設xij = 0

把源點標記為∞/-,再把源點加入到空佇列q中

while

not empty(q) do

i ← front(q); dequeue(q)

for 從i到j的每條邊 do

//前向邊

if j沒有被標記

rij ← uij - xij

if rij > 0

lj ← min; 用lj/i+來標記j

enqueue(q,j)

for 從j到i的每條邊 do

//後向邊

if j沒有被標記

if xji > 0

lj ← min; 用lj/i-來標記j

enqueue(q,j)

if 匯點被標記了

//沿著找到的增益路徑進行增益

j ← n//從匯點開始,用第二個標記反向移動

while j ≠ 1

//沒有到達源點

if 頂點j的第二個標記是i+

xij ← xij + ln

else

//頂點j的第二個標記是i—

xji ← xji -ln

除了源點,擦去所有頂點的標記

用源點對q重新初始化

return x //當前的流量是最大的

例子——>

最大流問題

暫時最大流問題我就先掌握這一種演算法吧 基本的最大流問題 ek演算法 基於bfs 每一次bfs更新一條路徑,雖然都會入佇列,但是由於以下條件保證點不會交叉,所以只有一條到終點的路徑會更新流量。if res v map u v flow u v 注意更新flow矩陣的時候是這樣的 while u st...

最大流問題

對最大流問題比較感性的認識,要看證明還是要看演算法導論的相關章節。最大流問題 給定乙個有向圖,一般情況下邊的值為整數,定義不直接相連的節點間的邊值為0,如果有節點i和j直接由多條邊,則將這些邊合併為一條,值取和。則若i到j有邊,則j到i的邊為0,這些邊稱為反向邊。定義其中的兩個點位源點和匯點,則這個...

最大流問題

真的,資料好多的,兩個差不多了,但其實,我是讀運籌學教程 演算法競賽入門經典訓練指南讀懂的。比較全面的是輝夜 永遠亭寫的,基本上的流程都介紹了,特別是比較寫得很好。當然上也有人 主要涉及以下 不過演算法具體來講,這篇最大流dinic演算法寫得蠻好,雖然我是看書。另外乙個問題就是最小費用最大流問題,鏈...