Cod sursa(job #671819)

Utilizator informatician28Andrei Dinu informatician28 Data 31 ianuarie 2012 21:58:52
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include<fstream> 
#include<vector>
#include<queue> 
#include<bitset>
#define DIM 1001 
#define pb push_back
#define INF 0x3f3f3f3f

using namespace std; 
ifstream in("maxflow.in"); 
ofstream out("maxflow.out"); 

int N, M, flow;
int F[DIM][DIM], C[DIM][DIM], T[DIM]; 
vector< int > G[DIM]; 
bitset< DIM > viz;
void Read() 
{
	int x, y, c, i; 
	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); 
	while( !Q.empty() )
	{
		int nod = Q.front(); 
		Q.pop(); 
		
		for(vector< int > :: iterator it = G[nod].begin(); it != G[nod].end(); ++it ) 
		{
			if( F[nod][*it] < C[nod][*it] && !viz[*it] )
			{
				Q.push(*it); 
				viz.set(*it); 
				T[*it] = nod; 
			}
		}
	}
	return viz[N]; 
}
				
void Solve() 
{
	int nod, fmin; 
	while( BFs() ) 
	{ 
		fmin = INF; 
		for(nod = N; nod != 1; nod = T[nod] )
			fmin = min(fmin, C[T[nod]][nod] - F[T[nod]][nod]); 
		for(nod = N; nod != 1; nod = T[nod] ) 
		{
			F[T[nod]][nod] += fmin; 
			F[nod][T[nod]] -= fmin; 
		}
		flow += fmin; 
	}
}
int main() 
{
    Read(); 
    Solve();
	
	out << flow; 
	return 0;
}