Pagini recente » Cod sursa (job #3163068) | Cod sursa (job #2867334) | Cod sursa (job #1721535) | Cod sursa (job #1916580) | Cod sursa (job #487462)
Cod sursa(job #487462)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int NMAX = 1005;
int C[NMAX][NMAX], F[NMAX][NMAX], Q[NMAX], T[NMAX], viz[NMAX], n, m, flux_max;
vector <int> G[NMAX];
int BFS ();
void citire (), afisare (), flux ();
int main () {
citire ();
flux ();
afisare ();
return 0;
}
void citire () {
freopen ("maxflow.in", "r", stdin);
int i, x, y, c;
scanf ("%d %d", &n, &m);
for (i = 1; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &c);
G[x].push_back (y);
G[y].push_back (x);
C[x][y] = c;
}
}
int BFS () {
int i, p, u, nod, fiu, ok;
memset (viz, 0, sizeof (viz));
Q[1] = 1, viz[1] = 1, ok = 0;
for (p = u = 1; p <= u; p++) {
nod = Q[p];
for (i = 0; i < (int) G[nod].size (); i++) {
fiu = G[nod][i];
if (!viz[fiu] && C[nod][fiu] > F[nod][fiu]) {
if (fiu == n) {
ok = 1; continue;
}
Q[++u] = fiu;
viz[fiu] = 1, T[fiu] = nod;
}
}
}
return ok;
}
void flux () {
int i, nod, fr, minim;
while (BFS ()) {
for (i = 0; i < (int) G[n].size (); i++) {
fr = G[n][i];
minim = C[fr][n] - F[fr][n];
for (nod = fr; T[nod] != 0; nod = T[nod])
minim = min (minim, C[T[nod]][nod] - F[T[nod]][nod]);
for (T[n] = fr, nod = n; T[nod] != 0; nod = T[nod]) {
F[T[nod]][nod] += minim;
F[nod][T[nod]] -= minim;
}
flux_max += minim;
}
}
}
void afisare () {
freopen ("maxflow.out", "w", stdout);
printf ("%d", flux_max);
}