Pagini recente » Cod sursa (job #1897374) | Cod sursa (job #2261323) | Cod sursa (job #1783271) | Cod sursa (job #989526) | Cod sursa (job #317810)
Cod sursa(job #317810)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxN 1024
#define oo 100000000
int F[maxN][maxN], C[maxN][maxN], P[maxN], Flux[maxN];
int N, M, S, D, Q[maxN * maxN];
inline int min (int a, int b) {
if (a > b) return b;
return a;
}
bool drum () {
int st, dr, i, now;
memset (P, 0, sizeof(P));
memset (Flux, 0, sizeof(Flux));
Q[st = 0] = S; dr = 1;
Flux[S] = oo;
while (st < dr) {
now = Q[st ++ ];
for (i = 1; i <= N; ++ i)
if (!Flux[i] && C[now][i] != 0) {
Flux[i] = min (Flux[now], abs (C[now][i]));
Q[dr ++] = i;
P[i] = now;
if (i == D)
return true;
}
}
return false;
}
void flux () {
int nod, i, j, Fmax = 0;
while (drum () ) {
// drum ();
// for (i = 1; i <= N; ++ i)
// fprintf(stderr, "%d ", P[i]);
// fprintf(stderr, "*");
for (nod = D; nod != S; nod = P[nod]) {
if (C[P[nod]][nod] > 0) {
F[P[nod]][nod] += Flux[D];
C[P[nod]][nod] -= Flux[D];
C[nod][P[nod]] = - Flux[D];
} else {
F[P[nod]][nod] -= Flux[D];
C[P[nod]][nod] += Flux[D];
C[nod][P[nod]] = - Flux[D];
}
}
Fmax += Flux[D];
/* printf("****************************\n");
for (i = 1; i <= N; ++ i) {
for (j = 1; j <= N; ++ j)
printf("%d ", C[i][j]);
printf("\n");
}
printf("\n");
for (i = 1; i <= N; ++ i) {
for (j = 1; j <= N; ++ j)
printf("%d ", F[i][j]);
printf("\n");
}
*/
}
printf("%d\n", Fmax);
}
int main () {
int i, a, b, c;
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%d%d", &N, &M);
S = 1; D = N;
for (i = 1; i <= M; ++ i) {
scanf("%d%d%d", &a, &b, &c);
C[a][b] += c;
}
flux ();
}