Cod sursa(job #282799)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 18 martie 2009 12:05:01
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <list>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 360
#define fc(x,y) (C[x][y]-F[x][y])
typedef list<int> li;

ifstream in( "fmcm.in" );
ofstream out( "fmcm.out" );

int N,M,S,D;
int C[MAX][MAX], Cst[MAX][MAX], F[MAX][MAX];
li G[MAX], L;
int i, r, rc, f, c;
int T[MAX], Dist[MAX], U[MAX],enq[MAX];

int Bellman() {
	int nr = sizeof(int)*(N+1);
	memset( T, 0, nr );
	memset( Dist, 0x3f, nr );
	memset( U, 0, nr );
	memset( enq, 0, nr );
	li Q;
	Q.push_back( S );
    Dist[S] = 0;
	while ( !Q.empty() ) {
		int x = Q.front(); Q.pop_front();
		U[x] ++; enq[x] = 0;
		if ( U[x] == N ) return 0x3f3f3f3f; 
		for ( li::iterator i=G[x].begin(); i!=G[x].end(); ++i ) { 
			if ( fc(x,*i) > 0 && Dist[*i] > Dist[x]+Cst[x][*i] ) {
				Dist[*i] = Dist[x]+Cst[x][*i], T[*i] = x;
				if ( enq[*i]==0 ) 
					enq[*i] = 1, Q.push_back(*i);
			}
		}
	}
	return Dist[D];
	
	for ( i=1; i<=N; ++i ) 
		cerr << Dist[i] << " ";
	cerr << "\n";
	return Dist[D];
}

int main() {
	// load
	in >> N >> M >> S >> D;
	while ( M-- ) {
		int x, y ,capac, cost;
		in >> x >> y >> capac >> cost;
		C[x][y] = capac;
		Cst[x][y] = cost;
		Cst[y][x] = -cost;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	// do_flux, please...
	for ( f=c=0; (rc=Bellman())!=0x3f3f3f3f; f+=r, c+=r*rc) {
		r = 0x3f3f3f3f;
		for ( i=D; i!=S; i=T[i] )
			r = min(r, fc(T[i],i));
		for ( i=D; i!=S; i=T[i] )
			F[T[i]][i] += r, F[i][T[i]] -= r;
	}

	// afis
	out << c << "\n";
	return 0;
}