Pagini recente » Cod sursa (job #1901991) | Cod sursa (job #1828813) | Cod sursa (job #2944497) | Cod sursa (job #193423) | Cod sursa (job #1526605)
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int MAX_N = 1000;
const int MAX_M = 5000;
int n, m;
int R[1 + MAX_N];
int C[1 + MAX_N][1 + MAX_N];
int F[1 + MAX_N][1 + MAX_N];
vector < int > G[1 + MAX_N];
queue < int > Q;
int goPath(int u, int augm) {
int v;
for(v = u; R[v] != v && C[R[v]][v] > F[R[v]][v]; v = R[v]) augm = min(augm, C[R[v]][v] - F[R[v]][v]);
if(R[v] != v) return 0;
for(v = u; R[v] != v && C[R[v]][v] > F[R[v]][v]; v = R[v]) {
F[R[v]][v] += augm;
F[v][R[v]] -= augm;
}
return augm;
}
int augument() {
int i, u, augm = 0, augmPath;
memset(R, 0, sizeof(R));
R[1] = 1;
Q.push(1);
while(!Q.empty()) {
u = Q.front();
Q.pop();
for(auto i : G[u]) {
if(i != n && !R[i] && F[u][i] < C[u][i]) {
R[i] = u;
Q.push(i);
}
}
}
for(i = 1; i <= n; i++) {
if(F[i][n] < C[i][n]) {
augmPath = C[i][n] - F[i][n];
augmPath = goPath(i, augmPath);
F[i][n] += augmPath;
F[n][i] -= augmPath;
augm += augmPath;
}
}
return augm;
}
int main() {
int u, v, c, i, j, flow = 0, augm;
in >> n >> m;
for(i = 1; i <= m; i++) {
in >> u >> v >> c;
G[u].push_back(v);
G[v].push_back(u);
C[u][v] = c;
}
do {
augm = augument();
flow += augm;
} while(augm > 0);
out << flow << '\n';
return 0;
}