Pagini recente » Cod sursa (job #2105551) | Cod sursa (job #2849445) | Cod sursa (job #488344) | Cod sursa (job #603531) | Cod sursa (job #1526464)
#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 augument() {
int u, augm = 0x7fffffff;
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(!R[i] && F[u][i] < C[u][i]) {
R[i] = u;
Q.push(i);
}
}
}
if(R[n] == 0) return 0;
for(u = n; R[u] != u; u = R[u]) {
augm = min(augm, C[R[u]][u] - F[R[u]][u]);
}
for(u = n; R[u] != u; u = R[u]) {
F[R[u]][u] += augm;
F[u][R[u]] -= augm;
}
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;
}
/*for(i = 1; i <= n; i++) {
for(j = 1; j <= n; j++) {
out << C[i][j] << ' ';
}
out << '\n';
}*/
do {
augm = augument();
/*out << "AUGUMENTED\n";
out << augm << '\n';
for(int t = 1; t <= n; t++) {
for(int q = 1; q <= n; q++) {
out << F[t][q] << ' ';
}
out << '\n';
}*/
flow += augm;
} while(augm > 0);
out << flow << '\n';
return 0;
}