Cod sursa(job #255504)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 9 februarie 2009 21:22:44
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
#ifdef __ACASA__
#define MAXN 11
#else
#define MAXN 1001
#endif

int C[MAXN][MAXN];
int F[MAXN][MAXN];
int T[MAXN];
int N, M, flux, r, i;

int BF() {
	queue<int> Q;
	Q.push(1);
	T[1] = -1;
	memset( T, 0, sizeof(T) );
	while ( !Q.empty() ) {
		int x = Q.front();
		for ( int i=1; i<=N; ++i ) 
			if ( C[x][i]>F[x][i] && T[i]==0 ) {
				Q.push(i); T[i] = x; 
				if ( i==N ) return 1;
			}
        Q.pop();
	}
	return 0;
}

int main() {
	// load
	ifstream in("maxflow.in");
	in >> N >> M;
	while ( M-- ) {
		int x, y, c;
		in >> x >> y >> c;
		C[x][y] = c;
	}

	//flow
	for ( flux=0; BF(); flux+=r ) {
		for ( r=0x3f3f3f, i=N; i!=1; i=T[i] )
			r = r>(C[T[i]][i]-F[T[i]][i]) ? C[T[i]][i]-F[T[i]][i] : r;
		for ( i=N; i!=1; i=T[i] ) 
			F[T[i]][i] += r, F[i][T[i]] -= r;
	}


	// output
	ofstream("maxflow.out") << flux << "\n";
	return 0;
}