最大流演算法是網路流中基礎的演算法,解決的方法有很多,比如ek,dinic,sap等等,在這裡介紹一下ek演算法。
從源點s開始廣度優先尋找一條到t的路徑,計算出這條路徑的最大流量(短板效應)l,回溯,將這條路徑的每條邊的最大流量減去l,然後新增反向邊,容量為l,網路流的最大流max+=l。當找不到從s到t的一條路徑時退出,最大流量即為max。
ek模板:
#include #include using namespace std;
const int n = 202;
const int inf = 0x7fffffff;
queueq;
int n,m; //m為標號(從1到m),n為邊數
int start,end;
int map[n][n];
int path[n]; //結點的前驅結點
int flow[n]; //標記從源點到當前節點實際還剩多少流量可用
int bfs()
} }if(path[end] == -1)
return -1;
return flow[end]; //一次遍歷之後的流量增量(剩餘多少流量)
}int edmonds_karp()
} return max_flow;
}int main()
start = 1, end = m;
printf("%d\n",edmonds_karp());
} return 0;
}
其實,當已知乙個網路,求最大流就非常簡單,直接套用模板就行,但往往難點在建圖,如何將題目描述轉化為乙個單源單匯的網路,下面列舉幾個題目:
poj1459
題目大意:有n個發電站,m個變壓器,c個消費者,發電站不消耗電能,消費者不產生電能,變壓器既不產生電能也不消耗電能。每個發電站都有最大的發電量,消費者也有最大的消耗量,每兩個點之間的線路也有最大容量。現在要求出這個網路的最大流量(顯然,在整個網路中,產生電量=消耗電量)。
分析:顯然這是乙個多源多匯的網路模型,可以做如下轉化:增加乙個超級源點s,它跟每個發電站連一條線,容量為發電站的最大發電量,增加乙個超級匯點t,每個消費者跟它連一條線,容量為消費者的最大消費量。這樣,問題就轉化為求這樣單源單匯的簡單網路流。
poj1149
題目大意:乙個養豬場有n個豬房,每個豬房可以裝無限多的豬,每個顧客都有特定的豬房鑰匙和購買量,每個顧客買完後重新鎖上開啟的豬房,但鎖上之前可以將某豬房的豬分一些給另外一些豬房(即開啟的豬房之間可以相互調整數量),問最多能賣出多少頭豬。
分析:可以把顧客作為結點,增加源點s和匯點t,如果該客戶是第乙個擁有豬房鑰匙的人,從源點連線一條邊到該客戶;如果不是第一人,那麼從前乙個擁有該豬房鑰匙的客戶連一條邊到該客戶,容量為無窮;從每個客戶連一條邊到t,容量為該客戶購買量。這樣,就轉化為簡單的網路流。
網路流之最大流
網路流之最大流 一 問題引入。有n個排水口,不同的排水口之間有m條水管連線,水一開始從源點s流出,最終到達t。每條邊 水管 都有乙個最大的流量。除了s,t外,每個排水口的流入量都要等於流出量,詢問最多能有多少水到達終點t 如圖所示 即poj 1273 可以將問題進行如下整理 1 用c e 表示每條邊...
網路流之最大流
因為網上介紹網路流和最大流理論的文章非常的多,也都解釋的非常清晰並附帶 再加上繪圖技術不佳,語文表達極差,就只講解一下程式實現部分。想看理論講解及演算法正確性證明的讀者可以上網搜一搜,這裡推薦一篇部落格,鏈結如下 那麼,既然網上的資源那麼多,為什麼還要寫這篇部落格呢?一是為了湊數做筆記,二是網上的許...
網路流之最大流
通俗易懂的說就是從乙個起點運輸貨物到終點,但是途中運輸的容量有各自不同的限制,有大有小,起點和終點分別用s,t表示,其中有中轉點,運輸路線和運輸容量。用圖論中的有向圖中g v,e 來表示,每條邊 u,v 代表運輸路徑,邊上的權值代表運輸容量限制,各個節點表示每乙個中轉點。每乙個運輸路線上運輸量不能超...