Cod sursa(job #616296)

Utilizator BitOneSAlexandru BitOne Data 12 octombrie 2011 09:52:16
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <queue>
#include <vector>
#include <fstream>
#include <cstdlib>
#define N_MAX 1011
#define oo 1<<29

using namespace std;
int N;
int f[N_MAX];
int C[N_MAX][N_MAX], F[N_MAX][N_MAX];
queue< int > Q;
vector< int > G[N_MAX];
vector< int >::const_iterator it, iend;
inline int _min( int x, int y ) { return x <= y ? x : y; }
bool BFS()
{
	int x;
	for( x=1; x <= N; ++x )
		f[x]=-1;
	f[1]=-2;
	for( Q.push(1); !Q.empty(); )
	{
		x=Q.front(); Q.pop();
		if( N == x )
			continue;
		for( it=G[x].begin(), iend=G[x].end(); it < iend; ++it )
			if( -1 == f[*it] && C[x][*it] > F[x][*it] )
			{
				f[*it]=x;
				Q.push( *it );
			}
	}
	return -1 != f[N];
}
int main( void )
{
	int M, x, y, c, s=0;
	ifstream in( "maxflow.in" );
	for( in>>N>>M; M; --M )
	{
		in>>x>>y>>c;
		G[x].push_back( y );
		G[y].push_back( x );
		C[x][y]=c;
	}
	while( BFS() )
	{
		for( it=G[N].begin(), iend=G[N].end(); it < iend; ++it )
			if( -1 != f[*it] && C[*it][N] > F[*it][N] )
			{
				f[N]=*it;
				c=oo;
				for( x=N; -2 != f[x]; x=f[x] )
					c=_min( c, C[f[x]][x]-F[f[x]][x] );
				for( x=N; -2 != f[x]; x=f[x] )
					F[f[x]][x]+=c, F[x][f[x]]-=c;
				s+=c;
			}
	}
	ofstream out( "maxflow.out" );
	out<<s<<'\n';
	return EXIT_SUCCESS;
}