-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathEdmondsKarp Max Flow.cpp
71 lines (71 loc) · 1.36 KB
/
EdmondsKarp Max Flow.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include<deque>
#include<vector>
#include<algorithm>
using namespace std;
class MaxFlow
{
vector<vector<int> > cf, adj2, I_val;
vector<int> visited, parent, i_val;
int N, id, S, T;
public:
MaxFlow(int n) :N(n), cf(n), visited(n, false),parent(n), id(0), I_val(n), i_val(n), adj2(n)
{
}
void add(int u, int v, int w)
{
I_val[u].push_back(adj2[v].size());
I_val[v].push_back(adj2[u].size());
adj2[u].push_back(v), cf[u].push_back(w);
adj2[v].push_back(u), cf[v].push_back(0);
}
int path()
{
deque<int> Q, Min;
Q.push_back(S);
Min.push_back(1e9);
visited[S] = id;
int x, y;
while (!Q.empty())
{
x = Q.front();
y = Min.front();
Min.pop_front();
Q.pop_front();
for (int i = 0; i<cf[x].size(); i++)
{
if (cf[x][i] && visited[adj2[x][i]] != id)
{
parent[adj2[x][i]] = x;
i_val[adj2[x][i]] = i;
visited[adj2[x][i]] = id;
Min.push_back(min(y, cf[x][i]));
Q.push_back(adj2[x][i]);
if (adj2[x][i] == T)
return Min.back();
}
}
}
return 0;
}
int max_flow(int s, int t) // 0 indexed
{
S = s, T = t; int cmin = 0, A = 0;
int u = s, v = t, x;
id = 1;
for (cmin = path(); cmin != 0; cmin = path())
{
v = t;
while (v != s)
{
u = parent[v];
x = i_val[v];
cf[u][x] -= cmin;
cf[v][I_val[u][x]] += cmin;
v = u;
}
++id;
A += cmin;
}
return A;
}
};