使用dijkstra求解最小費用最大流網路

2021-07-30 06:50:04 字數 1817 閱讀 1704

在介紹如何使用dijkstra演算法求解最小費用最大流問題的時候,假設看這篇博文的讀者已經知道什麼是最小費用最大流問題及熟悉dijkstra單源最短路徑演算法。在這篇博文裡面,我並不會過多強調網路拓撲是有向圖和無向圖,因為對於無向圖來說,你可以簡單將其看成兩個點之間有一對有向邊的有向圖。

求解最大最小費用最大流經常有兩種方式:

1. 每次求出一條費用最小費用的增廣路徑

p ,將其加到當前費用流

f,得到更新後的費用流f′

,直到找不到增廣路徑為止

2. 先求網路的最大流fm

ax,然後不停的遍歷圖移動費用流fm

ax的路徑,使其費用降低,直到其費用不能降低為止。

使用dijkstra演算法求解最小費用最大流網路使用的是第一種方式,對於第一種方式,網上的部落格關於如何選擇最小費用的增廣路徑的方式一般都是給出的spfa(shortest path fast algorithm)方法。選擇該方式有一定原因是在求最小費用最大流問題的時候,其反向邊的權值是負權值,而該演算法是基於經典的bellman ford演算法優化的一種高效的可以用於求解負權值的演算法。但是,其實這種方式就效率來說遠遠不及dijkstra演算法,但為什麼網上的部落格中在介紹最小費用最大流演算法的時候沒有人介紹使用dijkstra演算法了?因為dijkstra演算法不能用於求解具有負權值的網路,所以他們覺得在這裡dijkstra演算法不適合。但是其實可以通過dijkstra演算法去求解最小費用最大流網路。下面就來給出相關解釋。

為了說明演算法的合理性,先給出一下定義:

對於兩個點

u ,

v,存在乙個流

f 從u經過v,不失一般性,我們將 f(

u,v)

方向的邊定義為正向邊,將f(

v,u)

方向的邊定義為反向邊,通常如果將正向邊的權值定義為c(

u,v)

=c,反向邊的權值將是c(

v,u)

=−c 。

能夠使用dijkstra演算法的前提基於以下幾個前提

1.在最小費用最大流中,任何結點對(u

,v) ,始終只存在乙個方向的流

f ,該方向要不是從u到

v ,要不是v到

u 。

2.在使用第一條方式求解最小費最大流演算法時候,每次選擇最小費用增廣路徑一定是當前殘留圖的最小增廣路徑。

3. 由於網路拓撲的費用和容量都是正值,而其反向邊的存在是存在一定限制的,所以在網路中永遠不可能有負環的存在。

讓我先來說說第一點,如果乙個結點對之間存在兩個方向的流(對於無向圖或有一對有向邊的有向圖),那麼其一定不是最小費用最大流網路,因為在該結點對上的兩個方向流是可以互相抵消的,肯定會存在乙個兩個方向互相抵消的更小費用的最大流網路。

第二點,我們在使用第一種方式的時候,每次選擇的路徑都必須是最小費用增廣矩陣,這樣才能保證我們最後得到的最小費用最大流網路

第三點,因為網路拓撲給的容量和費用都是正值,而只有當一條邊有流量通過之後,才存在其反向邊的概念,而其反向邊的最用就是為了回流,其容量限制就是正向邊的通過的流量,所以網路拓撲中不可能存在負環。

而dijkstra演算法不能應用負權值網路是因為其使用的是貪心策略,所以導致對於有負權值的邊有可能不會遍歷。但是注意我們所說到的前提第二點和第三點。負權值反向邊出現的條件是在正向邊有流量通過,且我們每次選擇最小費用的增廣路徑。而正因為兩個限制彌補了dijkstra演算法貪心策略的不足。大家自己畫畫圖就可以理解了,所以這裡我就不畫圖說明。

因此,正因為以上兩條限制,所以完全可以使用dijkstra替換spfa來尋找最小費用最大流網路。

dijkstra 最小費用最大流

滑稽 dijkstra同樣為最短路演算法,為什麼不能跑費用流qwq 好像是因為有負權邊的緣故 但是如果我們如果使用某種玄學的將邊權都拉回到正數的話 就可以跑了dijkstra,開心qwq 如果我們每條邊暴力加上乙個很大的值的話,我們還需要記錄所經過的邊數,還要保證不溢位,十分的毒瘤 尻考慮給每個節點...

最小費用流

include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...

最小費用流

int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...