最大流算法---Edmond-Karp
这个算法是基于FF方法,就是通过不断求残余网络的增广路来增广流量,直到找不到增广路为止。注意:每次找到增广路以后都要更新原网络。EK算法通过BFS寻找源S到汇T的一条最短路径,因此时间复杂度是O(VE^2).
模板代码如下:
#include<iostream> #include<queue> #include<cstring> #include<cstdio> #define MAX 1000 using namespace std; int res[MAX][MAX]; int vis[MAX], pre[MAX]; queue<int>q; int n; bool bfs(int s, int t) { int p; memset(vis, 0, sizeof(vis)); memset(pre, -1, sizeof(pre)); while(!q.empty() q.pop(); q.push(s); vis[s] = 1; while(!q.empty()) { p = q.front(); q.pop(); for(int i = 1;i <= n;i ++) { if(!vis[i] && res[p][i] > 0) { pre[i] = p; vis[i] = 1; if(i == t) return true; q.push(i); } } } return false; } int EdmondKarp(int s, int t) { int flow = 0, d, i, u; while(bfs(s, t)) { d = 1 << 30; u = t; while(pre[u] != -1) { d = min(d, res[pre[u]][u]); u = pre[u]; } u = t; while(pre[u] != -1) { res[pre[u]][u] -= d; res[u][pre[u]] += d; u = pre[u]; } flow += d; } return flow; } int main(int argc, char const *argv[]) { int m, u, v, w; freopen("in.c", "r", stdin); while(cin >> n >> m) { memset(res, 0, sizeof(res)); for(int i = 0;i < m;i ++) { cin >> u >> v >> w; res[u][v] += w; } int ans = EdmondKarp(1, n); cout << ans << endl; } return 0; }