Pagini recente » Cod sursa (job #861772) | Cod sursa (job #2814977) | Cod sursa (job #274583) | Cod sursa (job #486772) | Cod sursa (job #409943)
Cod sursa(job #409943)
#include <cstdio>
#include <vector>
using namespace std;
#define Nmax 1010
int n, m, maxflow;
int F[Nmax][Nmax], T[Nmax], Q[Nmax];
vector <int> G[Nmax];
void citire () {
int x, y, z, i;
scanf ("%d %d", &n, &m);
for (i = 1; i <= m; i++) {
scanf ("%d %d %d", &x, &y, &z);
G[x].push_back (y); G[y].push_back (x);
F[x][y] = z;
}
}
int BFS () {
int i, p, u = 0, nod, fiu, ok = 0;
memset (T, 0, sizeof (T));
T[1] = 1;
for (p = 1, Q[++u] = 1; p <= u; p++) {
nod = Q[p];
for (i = 0; i < (int)G[nod].size (); i++) {
fiu = G[nod][i];
if (!T[fiu] && F[nod][fiu]) {
if (fiu == n) {
ok = 1;
continue;
}
Q[++u] = fiu;
T[fiu] = nod;
}
}
}
return ok;
}
void flux () {
int i, fiu, Min, x;
while (BFS()) {
for (i = 0; i < (int)G[n].size (); i++) {
fiu = G[n][i]; Min = F[fiu][n];
if (T[fiu]) {
for (x = fiu; x != 1; x = T[x])
if (F[T[x]][x] < Min) Min = F[T[x]][x];
maxflow+= Min;
for (x = fiu; x != 1; x = T[x]) {
F[T[x]][x]-= Min;
F[x][T[x]]+= Min;
}
F[fiu][n]-= Min;
F[n][fiu]+= Min;
}
}
}
}
int main () {
freopen ("maxflow.in", "r", stdin);
freopen ("maxflow.out", "w", stdout);
citire ();
flux ();
printf ("%d", maxflow);
return 0;
}