Cod sursa(job #329538)

Utilizator TabaraTabara Mihai Tabara Data 6 iulie 2009 15:34:48
Problema Flux maxim Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 1.54 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define in "maxflow.in"
#define out "maxflow.out"
#define NMAX 1005
#define INF (1<<30)

#define ALB 0
#define GRI 1
#define NEGRU 2

#define minim(a,b) ((a) < (b) ? (a) : (b) )

typedef struct nod {
	int vf;
	struct nod *next;
} *PNOD, NOD;

PNOD L[NMAX];
int N, M, flow;
int Q[NMAX], tata[NMAX];
int C[NMAX][NMAX], F[NMAX][NMAX];
int color[NMAX];

void Add ( int i, int j )
{
	PNOD p = (PNOD)calloc ( 1, sizeof(NOD) );
	p->vf = j;
	p->next = L[ i ];
	L[ i ] = p;	
}

int BF()
{
	memset ( Q, 0, sizeof(Q) );
	memset ( color, 0, sizeof(color) );
	
	Q[ 0 ] = Q[ 1 ] = 1;
	color[ 1 ] = GRI;
	
	int i, nod;
	PNOD p;

	for ( i = 1; i <= Q[ 0 ]; ++i )
	{
		nod = Q[ i ];
		for ( p = L[ nod ]; p; p = p->next )
		{
			if ( C[nod][p->vf] == F[nod][p->vf] || color[p->vf] != ALB ) continue;
			color[p->vf] = GRI;
			Q[ ++Q[ 0 ] ] = p->vf;
			tata[ p->vf ] = nod;
			if ( p->vf == N ) return 1;
		}
		color[ nod ] = NEGRU;
	}
	
	return 0;
}

int main ( void ) 
{
	freopen ( in, "r", stdin );
	freopen ( out, "w", stdout );

	scanf ( "%d%d", &N, &M );
	int i, j, c, fmin, nod;
	for ( ; M; --M )
	{
		scanf ( "%d%d%d", &i, &j, &c );
		Add ( i, j );
		Add ( j, i ); // ???
		C[i][j] = c;
	}

	for ( flow = 0; BF(); flow += fmin )
	{
		fmin = INF;
		for ( nod = N; nod != 1; nod = tata[ nod ] )
			fmin = minim ( fmin, C[ tata[nod]][ nod ] - F[ tata[nod] ][ nod ] );
		for ( nod = N; nod != 1; nod = tata[ nod ] )
		{
			F[ tata[nod] ][ nod ] += fmin;
			F[ nod ][ tata[nod] ] -= fmin;
		}
	}
	
	printf ("%d\n", flow );
	return 0;
}