Cod sursa(job #671297)

Utilizator informatician28Andrei Dinu informatician28 Data 31 ianuarie 2012 09:36:29
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include<fstream> 
#include<vector>
#include<bitset>
#include<queue> 
#define DIM 1001
#define INF 0x3f3f3f3f
#define pb push_back
#define FOR(g, it) \
        for( vector< int > :: iterator it = g.begin(); it != g.end(); ++it ) 
		
        
using namespace std; 
ifstream in("maxflow.in"); 
ofstream out("maxflow.out"); 

int N, M, flux = 0; 
int  C[DIM][DIM], F[DIM][DIM], t[DIM]; 
vector< int > G[DIM]; 
bitset<DIM> viz; 

void Read() 
{
	int i;
	int x, y, c;
	in >> N >> M; 
	
	for(i = 1; i <= M; i++) 
	{
		in >> x >> y >> c; 
		G[x].pb(y); 
		G[y].pb(x); 
		C[x][y] = c; 
	}
}

int BFs() 
{
	queue< int > Q; 
	
	viz.reset();
	
	Q.push(1); 
	viz.set(1);
	
	vector< int > :: iterator it;
	int nod;
	while( !Q.empty() ) 
	{
		nod = Q.front(); 
		Q.pop(); 
		
		if( nod == N ) continue; 
		
		FOR( G[nod], it )
		{
			if( C[nod][*it] != F[nod][*it] && !viz[*it] ) 
			{
				viz.set(*it); 
				Q.push(*it); 
				t[*it] = nod; 
			}
		}
	}
	return viz[N]; 
}
void Solve() 
{
	int fmin = INF;
	
	while( BFs() )
		FOR(G[N], it)
	{
		int nod = *it; 
		
		if( C[nod][N] == F[nod][N] || !viz[nod] ) continue; 
		
		t[N] = nod; 
		fmin = INF; 
		
		for(nod = N; nod != 1; nod = t[nod] ) 
			fmin = min( fmin, C[t[nod]][nod] - F[t[nod]][nod] );
		
		if ( !fmin ) continue; 
		
		for(nod = N; nod != 1; nod = t[nod] )
		{
			F[t[nod]][nod] += fmin; 
			F[nod][t[nod]] -= fmin; 
		}
		
		flux += fmin; 
		}
}
			
int main() 
{
	Read(); 
	Solve();
	
	out << flux; 
}