Pagini recente » Cod sursa (job #1901905) | Cod sursa (job #690312) | Cod sursa (job #2426572) | Cod sursa (job #3271447) | Cod sursa (job #2708514)
#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
const int NMAX = 1000;
const int MMAX = 5000;
const int INF = 1000000000;
struct muchie {
int nod, vec, cf; /// cf = capacitate - flux
muchie(int _nod = 0, int _vec = 0, int _cf = 0) : nod(_nod), vec(_vec), cf(_cf) {}
};
bool viz[NMAX + 5];
int n, m, src, dest;
int from[NMAX + 5];
muchie muchii[2 * MMAX + 5];
vector<int> v[NMAX + 5];
queue<int> q;
bool bfs(int start) {
for(int i = 1; i <= n; i++)
viz[i] = false;
from[start] = -1;
q.push(start);
viz[start] = true;
while(!q.empty()) {
int crt = q.front();
q.pop();
if(crt == dest)
continue;
for(int idx: v[crt]) {
muchie &mch = muchii[idx];
if(!viz[mch.vec] && mch.cf) {
q.push(mch.vec);
from[mch.vec] = idx;
viz[mch.vec] = true;
}
}
}
return viz[dest];
}
void add_flux(int nod, int &fmin) {
if(from[nod] == -1)
return;
muchie &mch = muchii[from[nod]], &rmch = muchii[from[nod] ^ 1];
fmin = min(fmin, mch.cf);
add_flux(mch.nod, fmin);
mch.cf -= fmin;
rmch.cf += fmin;
}
int main() {
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
int x, y, z, flux, maxf;
scanf("%d %d", &n, &m);
src = 1, dest = n;
for(int i = 0; i < m; i++) {
scanf("%d %d %d", &x, &y, &z);
muchii[i << 1] = muchie(x, y, z);
v[x].push_back(i << 1);
muchii[i << 1 | 1] = muchie(y, x);
v[y].push_back(i << 1 | 1);
}
maxf = 0;
while(bfs(src))
for(int idx: v[dest]) {
muchie &rmch = muchii[idx ^ 1]; /// muchia inversa
if(viz[rmch.nod] && rmch.cf > 0) {
from[dest] = idx ^ 1;
flux = INF;
add_flux(dest, flux);
maxf += flux;
}
}
printf("%d", maxf);
return 0;
}