diff options
Diffstat (limited to 'maxFlow/edmondsKarp.cpp')
| -rw-r--r-- | maxFlow/edmondsKarp.cpp | 34 |
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 |
