具體的最大流問題定義、術語以及特性,前人已經描述的很詳細了:
我們需要注意以及幾個方面:
增益路徑的生成次序如果不恰當,會對方法的效率有巨大的影響。如下:其中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演算法寫得蠻好,雖然我是看書。另外乙個問題就是最小費用最大流問題,鏈...