Cod sursa(job #434404)

Utilizator MciprianMMciprianM MciprianM Data 5 aprilie 2010 20:42:36
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<fstream>
using namespace std;

# define MAXN 1024

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

int findPath(){
	int head = 0, i, dad, pathCap, gPathCap = 0;
	bool ok;
	memset ( viz, 0, sizeof ( viz ) );
	memset ( from, -1, sizeof ( from ) );
	qSize = lSize = 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 )	leafs [ lSize ++ ] = coada [ head ], qSize --, viz [ n ] = 0;
			}
		head ++;
	}
	
	if ( from [ n ] == -1 )	return 0;
	
	for ( i = 0; i < lSize; i ++ ){
		dad = n;	pathCap = 120000;
		from [ n ] = leafs [ i ];
		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 ];
		}
		gPathCap = gPathCap + pathCap;
	}
	return gPathCap;
}

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;
}