Pagini recente » Cod sursa (job #618194) | Cod sursa (job #269587)
Cod sursa(job #269587)
#include <cstdio>
#include <cstring>
#define Nmax 1001
struct graf { int nod; graf * next; } *g[Nmax];
int C[Nmax][Nmax], F[Nmax][Nmax];
int q[Nmax], viz[Nmax];
int N, M, x, y, z, i, j, P, U, flow, fmin;
int BF()
{
memset(viz,0,sizeof(viz));
q[0] = 1; P = U = 0;
viz[1] = 1;
while (P <= U)
{
x = q[P++];
for (graf * p = g[x]; p; p = p->next)
if (C[x][p->nod] > F[x][p->nod] && !viz[p->nod])
{
q[++U] = p->nod;
viz[p->nod] = x;
}
}
return viz[N];
}
inline int min(int x, int y) { return x < y ? x : y; }
int main()
{
freopen("maxflow.in", "r", stdin);
for ( scanf("%d %d\n", &N, &M); M; --M )
{
scanf("%d %d %d\n", &x, &y, &z);
C[x][y] = z;
graf * q = new graf; q->nod = y; q->next = g[x]; g[x] = q;
q = new graf; q->nod = x; q->next = g[y]; g[y] = q;
}
while (BF())
{
for (graf * p = g[N]; p; p = p -> next)
if (C[p->nod][N] > F[p->nod][N])
{
fmin = C[p->nod][N] - F[p->nod][N];
for (x = p->nod; x != 1; x = viz[x])
fmin = min(fmin, C[viz[x]][x] - F[viz[x]][x]);
for (x = p->nod; x != 1; x = viz[x])
{
F[viz[x]][x] += fmin;
F[x][viz[x]] -= fmin;
}
flow += fmin;
F[p->nod][N] += fmin;
F[N][p->nod] -= fmin;
}
}
fprintf(fopen("maxflow.out", "w"), "%d", flow);
return 0;
}