Cod sursa(job #276497)

Utilizator MarquiseMarquise Marquise Data 11 martie 2009 10:47:57
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#include <string.h>

#define NMAX 1005
#define INF 200000

int n, m, s, d, flux, c[NMAX][NMAX], f[NMAX][NMAX], t[NMAX];

struct NOD
{
    int info;
    NOD *next;
};

NOD *l[NMAX];

int minim(int a, int b)
{
	return a < b ? a : b;
}

int BFS(int s, int d)
{
	int p, u, nod, i, q[NMAX];
	NOD *aux;

	memset(t, 0, sizeof(t));

	p = u = 0;
	q[p] = s;
	t[s] = -1;

	while ( p <= u)
	{
		nod = q[p];
		for ( aux = l[nod]; aux; aux = aux -> next)
			if ( !t[aux -> info] && c[nod][aux -> info] - f[nod][aux -> info] > 0 )
			{
				u++;
				q[u] = aux -> info;
				t[aux -> info] = nod;
				if ( aux -> info == d)
					return 1;
			}
		p++;
	}

	return 0;
}



void flux_maxim()
{
	int i, cr;

	for ( flux = 0; BFS(s, d); flux +=cr)
	{
		cr = INF;
		i = d;
		while ( i != s)
		{
			cr = minim( cr, c[t[i]][i] - f[t[i]][i]);
			i = t[i];

		}
		i = d;
		while ( i != s)
		{
			f[t[i]][i] += cr;
			f[i][t[i]] -= cr;
			i = t[i];
		}

	}

	printf("%d\n", flux);
}

int main()
{
	int i, x, y, ca;
	NOD *aux;

	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);

	scanf("%d %d", &n, &m);

	for ( i = 1; i <= m; i++)
	{
		scanf("%d %d %d", &x, &y, &ca);
		c[x][y] = ca;
		aux = new NOD;
		aux -> info = y;
		aux -> next = l[x];
		l[x] = aux;

	}
	s = 1;
	d = n;

	flux_maxim();

	return 0;
}