Cod sursa(job #764718)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 5 iulie 2012 23:21:53
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>

using namespace std;

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

const int MAXN = 360;
const int INF = 1 << 14;

vector < pair < short, short > > graf[MAXN];

short c[MAXN][MAXN], f[MAXN][MAXN], dist[MAXN], t[MAXN];
bool viz[MAXN];
short N, M, S, D;
char *buffer;

struct comp
{
	bool operator () (const short &a, const short &b){
		return dist[a] > dist[b];
	}
};

priority_queue < short, vector <short>, comp > Q;

inline void getmin (short &a, short b)
{
	if (a > b)
		a = b;
}

inline bool BF ()
{
	vector < pair < short, short > > :: iterator it;
	short nod, i;
	
	for (i = 1; i <= N; ++i){
		dist[i] = INF;
		viz[i] = 0;
		t[i] = 0;
	}
	
	dist[S] = 0;
	Q.push (S);
	
	while (!Q.empty ()){
		nod = Q.top ();
		Q.pop ();
		viz[nod] = 0;
		
		for (it = graf[nod].begin (); it != graf[nod].end (); ++it)
			if (dist[nod] + (it -> second) < dist[it -> first] && c[nod][it -> first] != f[nod][it -> first]){
				dist[it -> first] = dist[nod] + (it -> second);
				t[it -> first] = nod;
				
				if (!viz[it -> first]){
					viz[it -> first] = 1;
					Q.push (it -> first);
				}
			}
	}
	
	return (dist[D] != INF);
}

void read (short &x)
{
	short neg = 1;
	
	while (*buffer < '0' || *buffer > '9'){
		++buffer;
		
		if (*buffer == '-')
			neg = (-1);
	}
	
	x = 0;
	
	while (*buffer >= '0' && *buffer <= '9'){
		x = (x * 10) + (*buffer - '0');
		++buffer;
	}
	
	x *= neg;
}

int main ()
{
	short x, y, cap, cost, i, fm;
	int flux = 0, fs;
	
	freopen ("fmcm.in", "r", stdin);
	freopen ("fmcm.out", "w", stdout);
	fseek (stdin, 0, SEEK_END);
	fs = ftell (stdin);
	buffer = (char*) malloc (fs);
	rewind (stdin);
	fread (buffer, 1, fs, stdin);
	
	//in >> N >> M >> S >> D;
	read(N), read(M), read(S), read(D);
	
	while (M--){
		//in >> x >> y >> cap >> cost;
		read(x), read(y), read(cap), read(cost);
		
		c[x][y] = cap;
		graf[x].push_back (make_pair (y, +cost));
		graf[y].push_back (make_pair (x, -cost));
	}
	
	for ( ; BF (); flux += fm * dist[D]){
		fm = INF;
		
		for (i = D; i != S; i = t[i])
			getmin (fm, c[ t[i] ][i] - f[ t[i] ][i]);
		
		if (!fm)
			continue;
		
		for (i = D; i != S; i = t[i]){
			f[ t[i] ][i] += fm;
			f[i][ t[i] ] -= fm;
		}
	}
	
	//out << flux ();
	printf ("%d", flux);
	
	return 0;
}