看過的最大流算法中,薛超英教授的《數據結構》第5章應該是講的比較易懂的,裏面沒有一開始就上來一堆符號。在線閱讀地址:html
http://max.book118.com/html/2012/0630/2313684.shtmios
http://www.doc88.com/p-407189007451.html算法
書中提供的算法屬於未經優化的Ford-Fulkerson算法,能夠學會此方法後再學習其餘方法。算法原理是:數據結構
Ford-Fulkerson 方法 (G,s,t) 1 將各邊上流量 f 初始化爲 0 2 while 存在一條增廣路徑 p 3 do 沿路徑 p 增廣流量 f 4 return f
上面提到的書寫的很通俗,可是我的感受有個問題是第5章圖算法安排的位置有點靠前。另外做者是學院派寫代碼有2點很差的地方:一是常常用單個字母命名變量,這樣帶來的最大問題是當用Ctrl+F查找變量時,難以查找;二是比較喜歡用do-while循環,可讀性沒有for好。另外我寫算法喜歡把輸入數據直接寫在初始化代碼中,便於檢查算法效果和調試。學習
下面是根據書中算法寫的代碼:優化
#include<iostream> #include<cmath> using namespace std; const int SCALE=6; int matrix[SCALE][SCALE]={0}; int flow[SCALE][SCALE]={0}; int stk[SCALE]={0}; void init() { matrix[0][1]=4; matrix[1][2]=4; matrix[2][3]=2; matrix[4][3]=6; matrix[4][5]=9; matrix[0][2]=8; matrix[2][4]=2; matrix[3][5]=7; matrix[1][3]=4; matrix[1][4]=1; } int findPath() { int mark[SCALE]; for(int i=0;i<SCALE;i++)mark[i]=0; int top=0; stk[top]=0; mark[top]=1; while(top>=0) { int current=abs(stk[top]); int i=0; for(i=0;i<SCALE;i++) { if(mark[i]==0) { if(matrix[current][i]>flow[current][i]) { top+=1; stk[top]=i; mark[i]=1; if(i==(SCALE-1)) { return top; } break; } else if(flow[i][current]>0) { top+=1; stk[top]=(-i); mark[i]=1; break; } } } if(i==SCALE) { top=top-1; } } return 0; } void update(int top) { int addValue=65535; for(int i=1;i<=top;i++) { int temp=0; int first=abs(stk[i-1]); int second=abs(stk[i]); if(stk[i]>0) { temp=matrix[first][second] - flow[first][second]; } else { temp=flow[second][first]; } if(addValue>temp) { addValue=temp; } } for(int i=1;i<=top;i++) { int first=abs(stk[i-1]); int second=abs(stk[i]); if(stk[i]>0) { flow[first][second] = flow[first][second]+addValue; } else { flow[second][first] = flow[second][first]-addValue; } } } int maxFlow() { int val=0; while((val=findPath())>0)update(val); int maxVolumn=0; for(int i=1;i<SCALE;i++) { maxVolumn += flow[0][i]; } return maxVolumn; } int main() { init(); cout<<maxFlow(); return 0; }