Cod sursa(job #901932)

Utilizator stay_awake77Cangea Catalina stay_awake77 Data 1 martie 2013 12:16:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#include <algorithm>

using namespace std;

#define NMAX 1001
#define INF 0x3f3f3f3f
#define pb push_back

int F[NMAX][NMAX], C[NMAX][NMAX];
int Dist[NMAX];
int T[NMAX];
int N, M, x, y, c, i, MaxFlow, FlowCt, Nod;
vector< int > G[NMAX];
bool USED[NMAX];

inline bool BF()
{
	memset( USED, false, sizeof(USED) );
	USED[1] = true;
	
	queue< int > Q;
	Q.push( 1 );
	
	memset( T, 0, sizeof(T) );
	
	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] < C[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( C, 0, sizeof(C) );
	while( M-- )
	{
		scanf("%d%d%d", &x, &y, &c);
		C[x][y] = c;
		G[x].pb( y );
		G[y].pb( x );
	}
	
	memset( F, 0, sizeof(F) );
	MaxFlow = 0;
	
	while( BF() )
		for( i = 1; i < N; ++i )
			if( T[i] && F[i][N] < C[i][N] )
			{
				FlowCt = C[i][N] - F[i][N];
				for( Nod = i; Nod != 1; Nod = T[Nod] )
					FlowCt = min( FlowCt, C[T[Nod]][Nod] - F[T[Nod]][Nod] );
				
				if( FlowCt )
				{
					F[i][N] += FlowCt; F[N][i] -= FlowCt;
					for( Nod = i; Nod != 1; Nod = T[Nod] )
						F[T[Nod]][Nod] += FlowCt, F[Nod][T[Nod]] -= FlowCt;
					
					MaxFlow += FlowCt;
				}
			}
	
	printf("%d\n", MaxFlow);
	
	return 0;
}