summaryrefslogtreecommitdiff
path: root/maxFlow/edmondsKarp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'maxFlow/edmondsKarp.cpp')
-rw-r--r--maxFlow/edmondsKarp.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/maxFlow/edmondsKarp.cpp b/maxFlow/edmondsKarp.cpp
new file mode 100644
index 0000000..c82b141
--- /dev/null
+++ b/maxFlow/edmondsKarp.cpp
@@ -0,0 +1,34 @@
+int s, t, f; //source, target, single flow
+int res[100][100]; //adj-matrix
+vector< vector<int> > adjList;
+int p[100]; //bfs spanning tree
+
+void augment(int v, int minEdge) {
+ if (v == s) { f = minEdge; return; }
+ else if (p[v] != -1) {
+ augment(p[v], min(minEdge, res[p[v]][v]));
+ res[p[v]][v] -= f; res[v][p[v]] += f;
+}}
+
+int main() {
+ //inititalize res, adjList, s, t
+ int mf = 0;
+ while (true) {
+ f = 0;
+ bitset<100> vis; vis[s] = true;
+ queue<int> q; q.push(s);
+ memset(p, -1, sizeof(p));
+ while (!q.empty()) { //BFS
+ int u = q.front(); q.pop();
+ if (u == t) break;
+ for (int j = 0; j < (int)adjList[u].size(); j++) {
+ int v = adjList[u][j];
+ if (res[u][v] > 0 && !vis[v]) {
+ vis[v] = true; q.push(v); p[v] = u;
+ }}}
+
+ augment(t, INF); //add found path to max flow
+ if (f == 0) break;
+ mf += f;
+}}
+//max flow in mf} \ No newline at end of file