Pagini recente » Cod sursa (job #505179) | Cod sursa (job #3260903) | Cod sursa (job #2654616) | Cod sursa (job #1600389) | Cod sursa (job #2569188)
#include <fstream>
#include <vector>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
ifstream inf("maxflow.in");
ofstream outf("maxflow.out");
const int NMAX = 1000;
vector<int> ad[NMAX];
int flow[NMAX][NMAX];
int cap[NMAX][NMAX];
int pred[NMAX];
int main() {
int n, m, x, y, c;
inf >> n >> m;
for(int i = 0; i < m; i++) {
inf >> x >> y >> c;
x--;
y--;
if(!cap[x][y]) {
ad[x].push_back(y);
ad[y].push_back(x);
}
cap[x][y] += c;
}
int ftot = 0;
do {
memset(pred, 0xff, sizeof(pred));
queue<int> q;
q.push(0);
while(!q.empty()) {
x = q.front();
q.pop();
if(x == n - 1) {
continue;
}
for(int el : ad[x]) {
if(pred[el] == -1 && flow[x][el] < cap[x][el]) {
pred[el] = x;
q.push(el);
}
}
}
if(pred[n - 1] != -1) {
for(int el : ad[n - 1]) {
if(pred[el] != -1 && flow[el][n - 1] < cap[el][n - 1]) {
pred[n - 1] = el;
int fmin = 0x3f3f3f3f;
for(int x = n - 1; x; x = pred[x]) {
fmin = min(fmin, cap[pred[x]][x] - flow[pred[x]][x]);
}
for(int x = n - 1; x; x = pred[x]) {
flow[pred[x]][x] += fmin;
flow[x][pred[x]] -= fmin;
}
ftot += fmin;
}
}
}
} while(pred[n - 1] != -1);
outf << ftot;
return 0;
}