最大流算法---Edmond-Karp

这个算法是基于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 }
原文地址:https://www.cnblogs.com/anhuizhiye/p/3583366.html