基本的知識,解決什麼問題這些東西就不說啦。演算法導論和很多大神部落格都講解的很詳細。
它其實就是不停的找增廣路直到找不到為止。此時通過的所有流量就是最大流量。
ford-fulkerson 最大流演算法
下面是我的實現。
參考了最大流ford-fulkerson的演算法實現
#include#includeusing namespace std;
#define max 1024
int nodes,edges;
int capacity[max][max];//記錄邊的當前還可以通過的最大流量
int maxflow=0;
bool isvisited[max];//在bfs或dfs找增廣路的時候記錄該元素是否訪問過
int pre[max];//記錄節點的前乙個節點
/* 我最疑惑的地方是capacity[i][pre[i]]+=increase;這個地方。
我們一開始以為這只是乙個簡單的有向圖,其實不是,這個有向圖會根據它的兩個節點之間的通過的流量自動改變
我們可以把它看成是最原始的有向圖中有箭頭的兩個節點可以相互通過流,而不僅僅是沿箭頭的方向通過流(通過判斷兩個節點之間的最大
流量來判斷。)
表達能力實在有限。。我自己都覺得沒說清楚..
*/inline int min(int a,int b)
bool dfs(int src)
for(i=nodes-1;pre[i]>=0;i=pre[i])
maxflow+=increase;
}}void main()
maxflow();
cout<
這裡提供兩種找增廣路的演算法:dfs和bfs。
最大流演算法
encoding gbk from queue import queue m 6 點的個數 殘餘圖的剩餘流量 residual 0 for i in range m for j in range m 記錄最大流圖,初始都為0 maxflowgraph 0 for i in range m for j...
最大流SAP演算法
求最大流有一種經典的演算法,就是每次找增廣路時用bfs找,保證找到的增廣路是弧數最少的,也就是所謂的edmonds karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過v e次,每次bfs的時間都是o e 所以edmonds karp的時間複雜度就是o v e 2 如果能讓每次尋找增廣路時的...
最大流演算法模板
最大流 memset head,1,sizeof head en 0 struct edgee e bool del v int head v d v q v stk v pre v en,src,dest void addedge int x,int y,int c bool bfs int s ...