【轉】最大流EK演算法

來源:互聯網
上載者:User

標籤:路徑   演算法   blank   流程   tar   而不是   實現   為什麼   方法   

轉自:http://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html

 

圖-1


 

  -1所示,在這個運輸網路中,源點S和匯點T分別是1,7,各邊的容量為C(u,v)。圖中紅色虛線所示就是一個可行流。標準圖示法-2所示:

 

其中p(u,v) / c(u,v)分別表示該邊的實際流量與最大容量。

 

關於最大流

  熟悉了什麼是網路流,最大流也就很好理解了。就是對於任意的u∈V-{s},使得p(s,u)的和達到最大。上面的運輸網路中,最大流-3所示:MaxFlow=p(1,2)+p(1,3)=2+1=3。

 

  在介紹最大流問題之前,先介紹幾個概念:殘餘網路,增廣路徑,反向弧,最大流定理以及求最大流的Ford-Fulkerson方法。

殘餘網路 增廣路徑 反向弧

  觀察-4,這種狀態下它的殘餘網路-5所示:

  也許現在你已經知道什麼是殘餘網路了,對於已經找到一條從S 到T的路徑的網路中,只要在這條路徑上,把C(u,v)的值更新為C(u,v)-P(u,v),並且添加反向弧C(v,u)。對應的增廣路徑Path為殘留網路上從S到T的一條簡單路徑。圖-4中1,2,4,7就是一條增廣路徑,當然還有1,3,4,7。

  此外在未做任何操作之前,原始的有向圖也是一個殘餘網路,它僅僅是未做任何更新而已。

 

最大流定理

  如果殘留網路上找不到增廣路徑,則當前流為最大流;反之,如果當前流不為最大流,則一定有增廣路徑。

 

Ford-Fulkerson方法

  介紹完上面的概念之後,便可以用Ford-Fulkerson方法求最大流了。為什麼叫Ford-Fulkerson方法而不是演算法,原因在於可以用多種方式實現這一方法,方式並不唯一。下面介紹一種基於廣度優先搜尋(BFS)來計算增廣路徑P的演算法:Edmonds-Karp演算法。

  演算法流程如下:

  設隊列Q:儲存當前未訪問的節點,隊首節點出隊後,成為已檢查的標點;

  Path數組:儲存當前已訪問過的節點的增廣路徑;

  Flow數組:儲存一次BFS遍曆之後流的可改進量;

  Repeat:

    Path清空;

    源點S進入Path和Q,Path[S]<-0,Flow[S]<-+∞;

    While Q非空 and 匯點T未訪問 do

        Begin

            隊首頂點u出對;

            For每一條從u出發的弧(u,v) do

                If v未訪問 and 弧(u,v) 的流量可改進;

                Then Flow[v]<-min(Flow[u],c[u][v]) and v入隊 and Path[v]<-u;

    End while

   

    If(匯點T已訪問)

    Then 從匯點T沿著Path構造殘餘網路;

  Until 匯點T未被訪問

【轉】最大流EK演算法

相關關鍵詞:
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.