Cod sursa(job #269586)

Utilizator coderninuHasna Robert coderninu Data 3 martie 2009 01:50:05
Problema Flux maxim Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <cstring>

#define Nmax 1001
#define inf (1 << 31) - 1

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 = inf;
				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;
}