Cod sursa(job #622692)

Utilizator lily3Moldovan Liliana lily3 Data 18 octombrie 2011 13:28:02
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>

#define inf 1000000000
#define MAXN 355
#define sd short int
#define f first
#define s second
#define VIT vector <pair <sd, sd> > :: iterator

using namespace std;

bitset <MAXN> viz;
vector <pair <sd, sd> > G[MAXN];
int d[MAXN];
sd matCap[MAXN][MAXN], matflux[MAXN][MAXN];
int N, M, S, D;
sd dad[MAXN];
int sol;
inline bool BF ()
{
	queue <int> Q;
	
	int nod, i;
	viz.reset ();
	Q.push (S);
	
	for (i = 1; i <= N; i++) {
		dad[i] = 0;
		d[i] = inf;
	}
	d[S] = 0;
	
	while (!Q.empty ()) {

		nod = Q.front ();
		Q.pop ();

		viz[nod] = 0;
		for (VIT it = G[nod].begin (); it != G[nod].end (); it++)
			if (matCap[nod][it -> f] > matflux[nod][it -> f] && d[it -> f] > d[nod] + it -> s) {
				
				d[it -> f] = d[nod] + it -> s;
				dad[it -> f] = nod;
				
				if (viz[it -> f] == 0) {
					viz[it -> f] = 1;
					Q.push (it -> f);
				}
			}
	}

	return d[D] != inf;
}
int main ()
{


	freopen ("fmcm.in", "r", stdin);
	freopen ("fmcm.out", "w", stdout);


	scanf ("%d %d %d %d\n", &N, &M, &S, &D);

	int i, fmin, nod;
	sd x, y, cap, cost;
	while (M--) {

		scanf ("%hd %hd %hd %hd\n", &x, &y, &cap, &cost);
		
		matCap[x][y] = cap;
		G[x].push_back (make_pair (y, cost));
		G[y].push_back (make_pair (x, -cost));
	}
	
	
	while (BF ()) {
		
		nod = D;
		fmin = inf;
		
		
		for (i = nod; i != S; i = dad[i])
			fmin = min (fmin, matCap[dad[i]][i] - matflux[dad[i]][i]);
		
		if (fmin == 0) continue;
		
		for (i = nod; i != S; i = dad[i]) {

	//		printf ("%d ->, ", i);
			matflux[dad[i]][i] += fmin;
			matflux[i][dad[i]] -= fmin;
		}
	//	printf ("\n");
		sol += d[D] * fmin;
		
//		printf ("%d\n", sol);

	}
	
	printf ("%d\n", sol);
	return 0;
}