網路流之最大流

2021-10-23 01:13:46 字數 1426 閱讀 2925

通俗易懂的說就是從乙個起點運輸貨物到終點,但是途中運輸的容量有各自不同的限制,有大有小,起點和終點分別用s,t表示,其中有中轉點,運輸路線和運輸容量。用圖論中的有向圖中g(v,e)來表示,每條邊(u,v)代表運輸路徑,邊上的權值代表運輸容量限制,各個節點表示每乙個中轉點。每乙個運輸路線上運輸量不能超過這條運輸路線的最大容量限制。

用乙個簡單的有向圖來表示,畫個圖打個比方:

但是如果有其它節點分流到達終點t,也會增大流量的最大限制,例如:

除此之外,輸入和輸出要保持流量守恆,每乙個節點的輸入必須等於流量的輸出。所以每乙個中轉節點輸入和輸出中的最小值決定了這個從起點到終點的最大流量,形成木桶效應。例如:

實現方式是最大流求法,也就是bfs增廣路法,也就是ek演算法,歷史背景就不介紹了。那什麼是增廣路法呢?其實就像前面解釋的那樣,有一段節點,連線著源節點和終止節點,每一條邊的運輸量不能超過該條線的最大容量限制,我們可以利用bfs演算法,找到從起點到終點的最能接受的最小值

minvalue = (最大容量限制 - 流量),minvalue越小,說明在這條路上能通訊的流量已然達到最大了,這就是一條增廣路線。

在剩餘容量minvalue中,我們可以把minvalue看成是乙個新的容量限制,利用這種方式不斷尋找新的增廣路線,最後把所有的流量相加就是這個網路演算法的最大流。

利用**釋一下:

構造乙個有限圖:

* 這裡解釋一下為什麼會有

* f[i][parent[i]] -= res[end];

* 這裡是給路線一次反悔的機會,不然會造成不是最優解,而且也避免了回溯法帶來的巨大開銷

*/for(

int i = end; i != start; i = parent[i]

)// 將所有增廣路線帶來的流量相加

maxflow += res[end];}

}public

static

void

main

(string[

] args)

}謝

網路流之最大流

網路流之最大流 一 問題引入。有n個排水口,不同的排水口之間有m條水管連線,水一開始從源點s流出,最終到達t。每條邊 水管 都有乙個最大的流量。除了s,t外,每個排水口的流入量都要等於流出量,詢問最多能有多少水到達終點t 如圖所示 即poj 1273 可以將問題進行如下整理 1 用c e 表示每條邊...

網路流之最大流

因為網上介紹網路流和最大流理論的文章非常的多,也都解釋的非常清晰並附帶 再加上繪圖技術不佳,語文表達極差,就只講解一下程式實現部分。想看理論講解及演算法正確性證明的讀者可以上網搜一搜,這裡推薦一篇部落格,鏈結如下 那麼,既然網上的資源那麼多,為什麼還要寫這篇部落格呢?一是為了湊數做筆記,二是網上的許...

網路流之 最大流

最大流演算法是網路流中基礎的演算法,解決的方法有很多,比如ek,dinic,sap等等,在這裡介紹一下ek演算法。從源點s開始廣度優先尋找一條到t的路徑,計算出這條路徑的最大流量 短板效應 l,回溯,將這條路徑的每條邊的最大流量減去l,然後新增反向邊,容量為l,網路流的最大流max l。當找不到從s...