網路流SAP演算法

來源:互聯網
上載者:User

首先我麼先回顧一下EK(這個不會的可以看namiheike寫的EK的詳解,地址:http://www.oibh.org/bbs/thread-29333-1-1.html)。EK的思想就是每一次都用一個BFS來找到一條增廣路,所以說我們就會發現他的複雜度是:O(V*E^2)。所以說我們找到的不一定就是最優的。

 

本人的總結能力有限,以下給出dd_engi神牛的講解:

求最大流有一種經典的演算法,就是每次找增廣路時用BFS找,保證找到的增廣路是弧數最少的,也就是所謂的Edmonds-Karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過V*E次,每次BFS的時間都是O(E),所以Edmonds-Karp的時間複雜度就是O(V*E^2)。

 

如果能讓每次尋找增廣路時的時間複雜度降下來,那麼就能提高演算法效率了,使用距離標號的最短增廣路演算法就是這樣的。所謂距離標號,就是某個點到匯點的最少的弧的數量(另外一種距離標號是從源點到該點的最少的弧的數量,本質上沒什麼區別)。設點i的標號為D[i],那麼如果將滿足D[i]=D[j]+1的弧(i,j)叫做允許弧,且增廣時只走允許弧,那麼就可以達到“怎麼走都是最短路”的效果。每個點的初始標號可以在一開始用一次從匯點沿所有反向邊的BFS求出,實踐中可以初始設全部點的距離標號為0,問題就是如何在增廣過程中維護這個距離標號。

 

維護距離標號的方法是這樣的:當找增廣路過程中發現某點出發沒有允許弧時,將這個點的距離標號設為由它出發的所有弧的終點的距離標號的最小值加一。這種維護距離標號的方法的正確性我就不證了。由於距離標號的存在,由於“怎麼走都是最短路”,所以就可以採用DFS找增廣路,用一個棧儲存當前路徑的弧即可。當某個點的距離標號被改變時,棧中指向它的那條弧肯定已經不是允許弧了,所以就讓它出棧,並繼續用棧頂的弧的端點增廣。為了使每次找增廣路的時間變成均攤O(V),還有一個重要的最佳化是對於每個點儲存“當前弧”:初始時當前弧是鄰接表的第一條弧;在鄰接表中尋找時從當前弧開始尋找,找到了一條允許弧,就把這條弧設為當前弧;改變距離標號時,把當前弧重新設為鄰接表的第一條弧,還有一種在常數上有所最佳化的寫法是改變距離標號時把當前弧設為那條提供了最小標號的弧。當前弧的寫法之所以正確就在於任何時候我們都能保證在鄰接表中當前弧的前面肯定不存在允許弧。

 

還有一個常數最佳化是在每次找到路徑並增廣完畢之後不要將路徑中所有的頂點退棧,而是只將瓶頸邊以及之後的邊退棧,這是借鑒了Dinic演算法的思想。注意任何時候待增廣的“當前點”都應該是棧頂的點的終點。這的確只是一個常數最佳化,由於當前邊結構的存在,我們肯定可以在O(n)的時間內複原路徑中瓶頸邊之前的所有邊。

 

最佳化:

1.鄰接表最佳化:

如果頂點多的話,往往N^2存不下,這時候就要存邊:

存每條邊的出發點,終止點和價值,然後排序一下,再記錄每個出發點的位置。以後要調用從出發點出發的邊時候,只需要從屬記錄的位置開始找即可(其實可以用鏈表)。優點是時間加快空間節省,缺點是編程複雜度將變大,所以在題目允許的情況下,建議使用鄰接矩陣。

 

2.GAP最佳化:

如果一次重標號時,出現距離斷層,則可以證明ST無可行流,此時則可以直接退出演算法。

 

3.當前弧最佳化:

為了使每次找增廣路的時間變成均攤O(V),還有一個重要的最佳化是對於每個點儲存“當前弧”:初始時當前弧是鄰接表的第一條弧;在鄰接表中尋找時從當前弧開始尋找,找到了一條允許弧,就把這條弧設為當前弧;改變距離標號時,把當前弧重新設為鄰接表的第一條弧。

學過之後又看了演算法速度的比較,發現如果寫好的話SAP的速度不會輸給HLPP。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.