Cod sursa(job #764696)

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

using namespace std;

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

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

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

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

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

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

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

inline bool BF ()
{
	vector < pair < int, int > > :: iterator it;
	int 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);
}

int flux ()
{
	int fm, sol = 0, i;
	
	for ( ; BF (); sol += fm * dist[D]){
		fm = INF;
		
		for (i = D; i != S; i = t[i])
			getmin (fm, c[ t[i] ][i] - f[ t[i] ][i]);
		
		for (i = D; i != S; i = t[i]){
			f[ t[i] ][i] += fm;
			f[i][ t[i] ] -= fm;
		}
	}
	
	return sol;
}

void read (int &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 ()
{
	int x, y, cap, cost, 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));
	}
	
	//out << flux ();
	printf ("%d", flux ());
	
	return 0;
}