这个算法是基于FF方法,就是通过不断求残余网络的增广路来增广流量,直到找不到增广路为止。注意:每次找到增广路以后都要更新原网络。EK算法通过BFS寻找源S到汇T的一条最短路径,因此时间复杂度是O(VE^2).
模板代码如下:
1 #include<iostream> 2 #include<queue> 3 #include<cstring> 4 #include<cstdio> 5 #define MAX 1000 6 using namespace std; 7 int res[MAX][MAX]; 8 int vis[MAX], pre[MAX]; 9 queue<int>q; 10 int n; 11 bool bfs(int s, int t) 12 { 13 int p; 14 memset(vis, 0, sizeof(vis)); 15 memset(pre, -1, sizeof(pre)); 16 while(!q.empty() q.pop(); 17 q.push(s); 18 vis[s] = 1; 19 while(!q.empty()) 20 { 21 p = q.front(); 22 q.pop(); 23 for(int i = 1;i <= n;i ++) 24 { 25 if(!vis[i] && res[p][i] > 0) 26 { 27 pre[i] = p; 28 vis[i] = 1; 29 if(i == t) 30 return true; 31 q.push(i); 32 } 33 } 34 } 35 return false; 36 } 37 38 int EdmondKarp(int s, int t) 39 { 40 int flow = 0, d, i, u; 41 while(bfs(s, t)) 42 { 43 d = 1 << 30; 44 u = t; 45 while(pre[u] != -1) 46 { 47 d = min(d, res[pre[u]][u]); 48 u = pre[u]; 49 } 50 u = t; 51 while(pre[u] != -1) 52 { 53 res[pre[u]][u] -= d; 54 res[u][pre[u]] += d; 55 u = pre[u]; 56 } 57 flow += d; 58 } 59 return flow; 60 } 61 62 int main(int argc, char const *argv[]) 63 { 64 int m, u, v, w; 65 freopen("in.c", "r", stdin); 66 while(cin >> n >> m) 67 { 68 memset(res, 0, sizeof(res)); 69 for(int i = 0;i < m;i ++) 70 { 71 cin >> u >> v >> w; 72 res[u][v] += w; 73 } 74 int ans = EdmondKarp(1, n); 75 cout << ans << endl; 76 } 77 return 0; 78 }