Cod sursa(job #702903)

Utilizator arch_enemyAngela Gossow arch_enemy Data 2 martie 2012 10:00:48
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>

using namespace std;

#define NMAX 1001
#define pb push_back

int N, M, i, x, y, c, Flux, Adaug, Nod;
int Cap[NMAX][NMAX], F[NMAX][NMAX], T[NMAX];
vector< int > G[NMAX];
bool Used[NMAX];

inline bool BF()
{
	memset( Used, false, sizeof(Used) );
	Used[1] = true;
	
	memset( T, 0, sizeof(T) );
	T[1] = -1;
	
	queue< int > Q;
	Q.push( 1 );
	
	while( !Q.empty() )
	{
		Nod = Q.front(); Q.pop();
		for( vector< int >::iterator it = G[Nod].begin(); it != G[Nod].end(); ++it )
			if( !Used[*it] && F[Nod][*it] < Cap[Nod][*it] )
			{
				Used[*it] = true;
				Q.push( *it );
				T[*it] = Nod;
			}
	}
	
	return Used[N];
}

int main()
{
	freopen("maxflow.in", "r", stdin);
	freopen("maxflow.out", "w", stdout);
	
	scanf("%d%d", &N, &M );
	memset( Cap, 0, sizeof(Cap) );
	for( ; M--; )
	{
		scanf("%d%d%d", &x, &y, &c );
		G[x].pb( y );
		G[y].pb( x );
		Cap[x][y] = c;
	}
	
	memset( F, 0, sizeof(F) );
	for( Flux = 0; BF(); )
		for( i = 1; i < N; ++i )
			if( T[i] && F[i][N] < Cap[i][N] )
			{
				Adaug = Cap[i][N] - F[i][N];
				for( Nod = i; Nod != 1; Nod = T[Nod] )
					Adaug = min( Adaug, Cap[ T[Nod] ][Nod] - F[ T[Nod] ][Nod] );
				
				if( !Adaug ) continue;
				
				F[i][N] += Adaug, F[N][i] -= Adaug;
				for( Nod = i; Nod != 1; Nod = T[Nod] )
					F[ T[Nod] ][Nod] += Adaug, F[Nod][ T[Nod] ] -= Adaug;
				
				Flux += Adaug;
			}
	
	printf("%d\n", Flux );
	
	return 0;
}