演算法 日更 第三十四期 最大流演算法

2022-07-12 11:15:10 字數 1672 閱讀 8076

▎寫在前面

在之前,我們已經清楚了網路流與最大流是什麼,以及增廣的操作。

如果你還不會學習。

傳送門▎基本思路

先放上一張圖,要不然感覺有點空曠。

下方文字請結合上面的食用。

先來弄清楚乙個概念:容許流,就是從源點到匯點的流,顯然,乙個圖中的容許流不是唯一的,而最大流就是流量最大的容許流。

我們先假設s是源點,t是匯點,為了尋找s到t的最大流,我們應該不斷嘗試尋找增流路徑,增加容許流的流量,知道無法增加為止。這也被稱為增廣過程。

▎ford-fulkerson標號演算法

還是上面的圖。

我們對於一條邊,記錄三個值:這條邊的容量,已用容量,剩餘可用容量(不斷增廣時會消耗容量)。同時,再增加乙個叫做反射弧反向弧的東西,初始全部為0,用於儲存一條邊(u,v)的逆向邊(v,u),雖然不存在,但是可以用於反悔,以便於保證列舉到每一種情況。反向弧雖然名字特殊,但是我們把它視作普通的邊。

這個演算法既然叫作標號演算法,那麼一定是要標號的,對於每個點,都會有兩個標號:第乙個是前驅(也就是從那裡過來的),第二個是當前路徑上的最小邊權。

▎演算法**

首先放個圖:

然後從s開始標號。

然後隨便挑一條,走到1號點的位置,然後標號。

接著走到t。

然後發現已經到達了t,t已經被標過號了,於是最大流加1。

然後返回,我們會發現(1,t)這條邊減去1之後就是0了,那麼為了簡潔,我們就可以把它視作沒有了,再添一條反向弧。(s,1)也是同理。

接著我們用剛才的方法遍歷s -> 2 -> t這條路徑。

發現標號了t,那麼回溯,並且最大流加4。

於是我們就發現無法標號t了,那麼此網路的最大流就是1+4=5了。

▎演算法的正確性

雖然無法直接理解這個演算法到底為什麼正確,但是該有的條件它均已滿足:

①每條邊的長度都不可能是負數。

②每次增廣時,都能保證每個點流量平衡。

③每一次s的出流量和t的入流量都變化相同。

④只要最大流是有限的,那麼一定會在有限的時間內求出(不會死迴圈)。

演算法 日更 第三十八期 迭代器是什麼?

寫在前面 之前一直聽別人說用什麼迭代器之類的話,認為很高深,今天看了看,感覺也不是很高深。其實和指標差不多。迭代器 定義 迭代器 iterator 是一種物件,它能夠用來遍歷標準模板庫容器中的部分或全部元素,每個迭代器物件代表容器中的確定的位址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽...

演算法 日更 第三十六期 初賽偷懶攻略

寫在前面 洛谷是個好東西,又能上課,又能刷題,還能測初賽題,小編測了一下,才發現小編的初賽水平太菜了。小編決定好好補一補,不過也發現了很多實用的技巧。那麼我們就以noip2018其中的部分題目作為例子講解吧。number 1 下列四個不同進製的數中,與其它三項數值上不相等的是 a.269 16 b....

演算法 日更 第四十四期 虛二叉樹

前言 小編菜歸菜,但是好歹也寫過幾篇關於樹的部落格 線段樹 劃分樹 紅黑樹 如果你已經會了這些樹,那麼你一定會認為樹很麻煩,很燒腦。其中的紅黑樹是一種二叉排序樹實現自平衡的樹,但是最煩人,線段樹和劃分樹都很好寫,而紅黑樹不僅要建樹 查詢,還要再實現自平衡。但是虛二叉樹和紅黑樹功能一樣,只不過更大的優...