網路最大流和最小費用流

2021-06-05 12:24:59 字數 1630 閱讀 9795

from: 網路最大流和最小費用流.html

網路流isap演算法的簡單介紹

from: 

這幾天由於種種原因經常接觸到網路流的題目,這一型別的題給人的感覺,就是要非常使勁的yy才能出來點比較正常的模型。尤其是看了amber最小割應用的文章,裡面的題目思路真是充滿了綿綿不絕的yd思想。然而比賽中,當你yd到了這一層後,您不得不花比較多的時間去糾結於大量細節的實現,而冗長的**難免會使敲錯版後的除錯顯得異常悲傷,因此一些巧妙簡短高效的網路流演算法在此時便顯得猶為重要了。本文力求以最簡短的描述,對比較流行的網路流演算法作一定的總結,並借之向讀者強烈推薦一種效率與程式設計複雜度相適應的演算法。

眾所周知,在網路流的世界裡,存在2類截然不同的求解思想,就是比較著名的預流推進與增廣路,兩者都需要反向邊的小技巧。

其中預流推進的演算法思想是以邊為單元進行推流操作。具體流程如下:置初始點鄰接邊滿流並用一次反向bfs對每個結點計算反向距離標號,定義除匯點外存量大於出量的結點為活動結點,每次對活動結點按允許邊(u->v:d[u]=d[v]+1)進行推流操作,直到無法推流或者該點存量為0,若u點此時仍為活動結點,則進行重標號,使之等於原圖中進行推操作後的鄰接結點的最小標號+1,並將u點入隊。當隊列為空時,演算法結束,只有s點和t點存量非0,網路中各頂點無存量,無法找到增廣路繼續增廣,則t點存量為最大流。

而增廣路的思想在於每次從源點搜尋出一條前往匯點的增廣路,並改變路上的邊權,直到無法再進行增廣,此時匯點的增廣量即為最大流。兩者最後的理論基礎依然是增廣路定理,而在理論複雜度上預流推進要顯得比較優秀。其中的hlpp高標預流推進的理論複雜度已經達到了另人髮指的o(sqrt(m)*n*n),但是其程式設計複雜度也是同樣的令人髮指- -

於是我們能否在程式設計複雜度和演算法複雜度上找到乙個平衡呢,答案是肯定的。我們使用增廣路的思想,而且必須進行優化。因為原始的增廣路演算法(例如ek)是非常悲劇的。於是有人注意到了預流推進中的標號法,在增廣路演算法中引入允許弧概念,每次反搜殘留網路得到結點標號,在正向增廣中利用遞迴進行連續增廣,於是產生了基於分層圖的dinic演算法。一些人更不滿足於常規dinic所帶來的提公升,進而加入了多路分流增廣的概念,即對同一頂點的流量,分多路同時推進,再加上比較複雜的手工遞迴,使得dinic已經滿足大部分題目的需要。

然而這樣做就是增廣路演算法優化的極限麼?答案永遠是不。人們在dinic中只模擬了預流推進的標號技術,而重標號操作卻沒有發揮得淋漓盡致。於是人們在dinic的基礎上重新引入了重標號的概念,使得演算法無須在每次增廣後再進行bfs每個頂點進行距離標號,這種主動標號技術使得修正後演算法的速度有了不少提高。但這點提高是不足稱道的,人們又發現當某個標號的值沒有對應的頂點後,即增廣路被截斷了,於是演算法便可以提前結束,這種啟發式的優化稱為gap優化。最後人們結合了連續增廣,分層圖,多路增廣,gap優化,主動標號等窮凶極惡的優化,更甚者在此之上**個手動遞迴,於是產生了增廣路演算法的高效演算法–isap演算法。

雖然isap演算法的理論複雜度仍然不可超越高標預流推進,但其程式設計複雜度已經簡化到髮指,如此優化,加上不遜於dinic的速率(在效率上手工dinic有時甚至不如遞迴isap),我們沒有不選擇它的理由。

因此本**烈推薦isap作為網路流首選演算法。

其實現方法見下文,除去例行的添邊操作,不超過50行的**,何樂而不為之,以下實現仍有優化的餘地(在計算初始標號時,為減小**量直接忽略之,其複雜度不變,但實現後效率有5%左右的下降,如果樂意修正的話可以進行改良,當然不修正不影響演算法正確性)。

網路流 最小費用最大流

q 為什麼突然想搞網路流?a 迫於tham 蛤mu的淫威 用最短路演算法求出s t的路徑 把路徑要摳出來,而且每條邊要有容量 算一下路徑裡面的可以流過的最大的流量 發現此時的花費就是 dis t flow 累加即可.重複1 3直到不能夠到達t.include include include incl...

網路流 最大流 最小割 最小費用流

sap gap 鄰接表 sap gap 鄰接矩陣 dinic 鄰接矩陣 dinic 鄰接表 介個人寫的敲詳細 include include include include include using namespace std const int maxn 5010 const int maxn ...

網路流之 最小費用最大流

學習最小費用最大流前,需要學習最大流演算法。在最大流演算法中,沒有考慮邊的費用問題。在mincostmaxflow中,引入了費用的概念 cij表示邊 i,j 單位流量的費用。在滿足流量 v f 的同時,並且要求費用最少。最小費用最大流的迭代演算法 1.求出從s到t的最小費用通路 spfa 和通路的最...