Cod sursa(job #434399)

Utilizator MciprianMMciprianM MciprianM Data 5 aprilie 2010 20:28:54
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include<fstream>
using namespace std;

# define MAXN 1024

int n, m, qSize;
int cap [ MAXN ] [ MAXN ], coada [ MAXN ], from [ MAXN ];
bool viz [ MAXN ];

int findPath(){
	int head = 0, i, dad, pathCap;
	bool ok;
	memset ( viz, 0, sizeof ( viz ) );
	memset ( from, -1, sizeof ( from ) );
	qSize = 0;
	coada [ qSize ++ ] = 1;
	viz [ 1 ] = 1;
	ok = 1;
	while ( head < qSize && ok ){
		for ( i = 1; i <= n && ok ; i ++ )
			if ( cap [ coada [ head ] ] [ i ] > 0 && ! viz [ i ] ){
				coada [ qSize ++ ] = i;
				viz [ i ] = 1;
				from [ i ] = coada [ head ];
				if ( i == n )	ok = 0;
			}
		head ++;
	}
	
	if ( from [ n ] == -1 )	return 0;
	dad = n;	pathCap = 120000;
	
	while ( from [ dad ] != -1 ){
		if ( cap [ from [ dad ] ] [ dad ] < pathCap )
			pathCap = cap [ from [ dad ] ] [ dad ];
		dad = from [ dad ];
	}
	
	dad = n;
	
	while ( from [ dad ] != -1 ){
		cap [ from [ dad ] ] [ dad ] -= pathCap;
		cap [ dad ] [ from [ dad ] ] += pathCap;
		dad = from [ dad ];
	}
	return pathCap;
}

int maxFlow(){
	int d, flow=0;
	while ( 1 ){
		d = findPath ();
		if( d == 0 )	return flow;
		else			flow = flow + d;
	}
}

int main(){
	int x, y, c, i, flow = 0;
	ifstream f ( "maxflow.in" );
	f >> n >> m;
	for ( i = 0; i < m; i ++ ){
		f >> x >> y >> c;
		cap [ x ] [ y ] = c;
	}
	f.close();
	flow = maxFlow ();
	ofstream g ( "maxflow.out" );
	g << flow << '\n';
	g.close();
	return 0;
}