Pagini recente » Cod sursa (job #1719677) | Cod sursa (job #2113251) | Cod sursa (job #105760) | Cod sursa (job #939731) | Cod sursa (job #381069)
Cod sursa(job #381069)
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define Nmax 1024
void citire (), rezolvare (), afisare ();
int n, m, maxflow;
int viz[Nmax], Q[Nmax], T[Nmax], C[Nmax][Nmax], F[Nmax][Nmax];
vector <int> V[Nmax];
int main () {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
citire ();
rezolvare ();
afisare ();
return 0;
}
void citire () {
int a, b, c;
scanf ("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
scanf ("%d %d %d", &a, &b, &c);
V[a].push_back (b); C[a][b] = c;
V[b].push_back (a);
}
}
int BFS () {
int ok = 0, p, u, nod, i, fiu;
memset (viz, 0, sizeof (viz));
viz[1] = 1; Q[1] = 1;
for (p = u = 1; p <= u; p++) {
nod = Q[p];
for (i = 0; i < (int)V[nod].size (); i++) {
fiu = V[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 rezolvare () {
int fr, nod, minim;
while (BFS ()) {
for (int i = 0; i < (int)V[n].size(); i++) {
fr = V[n][i];
if (viz[fr]) {
minim = C[fr][n] - F[fr][n];
for (nod = fr; nod != 1; nod = T[nod])
minim = min (minim, C[T[nod]][nod] - F[T[nod]][nod]);
if (!minim) continue;
for (T[n] = fr, nod = n; nod != 1; nod = T[nod])
F[T[nod]][nod]+= minim,
F[nod][T[nod]]-= minim;
maxflow+= minim;
}
}
}
}
void afisare () {
printf ("%d", maxflow);
}