Pagini recente » Cod sursa (job #1330073) | Cod sursa (job #445389) | Cod sursa (job #1089961) | Cod sursa (job #2468799) | Cod sursa (job #2818333)
#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> p;
bool bfs() {
for(int i = 1; i <= n; i++) p[i] = 0;
queue <int> q; q.push(S);
p[S] = 1;
while(!q.empty()) {
int top = q.front(); q.pop();
//cout << top;
for(int adj : g[top])
if(c[top][adj] && !p[adj])
p[adj] = top,
q.push(adj);
}
return p[D] > 0;
}
public:
void read(istream& in) {
int m, u, v, w;
in >> n >> m; S = 1; D = n;
g.resize(n + 1); c.resize(n + 1);
for(auto& x : c) x.resize(n + 1, 0);
for(int i = 0; i < m; i++) {
in >> u >> v >> w;
g[u].push_back(v),
g[v].push_back(u),
c[u][v] = w,
c[v][u] = 0;
}
}
int edmonds_karp() {
p.resize(n);
while(bfs()) for(int last : g[D]) {
//cout << "\n";
//for(int i = 1; i <= n; i++) cout << c[p[i]][i]; cout << "\n";
// for(int i = 1; i <= n; i++) cout << c[i][p[i]]; cout << "\n";
//cout << last << " ";
int f = c[last][D];
for(int node = last; node != S; node = p[node])
f = min(f, c[p[node]][node]);
c[last][D] -= f;
c[D][last] += f;
for(int node = last; node != S; node = p[node]) {
c[p[node]][node] -= f;
c[node][p[node]] += f;
}
}
int res = 0;
for(int adj : g[S])
res += c[adj][S];
return res;
}
};
Flow f;
int main()
{
f.read(fin);
fout << f.edmonds_karp();
return 0;
}