Pagini recente » Cod sursa (job #1891532) | Cod sursa (job #1229822) | Cod sursa (job #2027160) | Cod sursa (job #3041555) | Cod sursa (job #2818301)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
class Flow {
vector <vector <int>> g;
int n, S, D;
vector <vector <int>> c;
vector <int> d, p;
int bfs() {
for(int i = 0; i < n; i++) d[i] = p[i] = 0;
d[S] = 1;
queue <int> q; q.push(S);
while(!q.empty()) {
int top = q.front(); q.pop();
for(int adj : g[top])
if(c[top][adj] && !d[adj]) {
d[adj] = d[top] + 1,
p[adj] = top,
q.push(adj);
if(adj == D) return top + 1;
}
}
return 0;
}
public:
void read(istream& in) {
int m, u, v, w;
in >> n >> m; S = 0; D = n - 1;
g.resize(n); c.resize(n);
for(auto& x : c) x.resize(n, 0);
for(int i = 0; i < m; i++) {
in >> u >> v >> w; u--, v--;
g[u].push_back(v),
g[v].push_back(u),
c[u][v] = w,
c[v][u] = 0;
}
}
int edmonds_karp() {
int last, res = 0; d.resize(n); p.resize(n);
while(last = bfs()) {
int f = c[last - 1][D];
for(int node = last - 1; node; node = p[node])
f = min(f, c[p[node]][node]);
for(int node = D; node; node = p[node])
c[p[node]][node] -= f,
c[node][p[node]] += f;
res += f;
}
return res;
}
};
Flow f;
int main()
{
f.read(fin);
fout << f.edmonds_karp();
return 0;
}