Cod sursa(job #424141)

Utilizator katakunaCazacu Alexandru katakuna Data 24 martie 2010 17:05:48
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;

#define Nmax 355
#define INF 0x3f3f3f3f

int n, m, S, D, sol;
int F[Nmax][Nmax], Cst[Nmax][Nmax], C[Nmax], T[Nmax];
vector <int> V[Nmax];

void citire () {

	int a, b, c, d, i;
	
	scanf ("%d %d %d %d", &n, &m, &S, &D);
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d %d", &a, &b, &c, &d);
		V[a].push_back (b); V[b].push_back (a);
		F[a][b] = c;
		Cst[a][b] = d; Cst[b][a] = -d;
	}
}

int Bellman_Ford () {
	
	queue <int> Q;
	int viz[Nmax];
	int nod, fiu, i, N;
	
	memset (viz, 0, sizeof (viz));
	memset (C, INF, sizeof (C));
	C[S] = 0; viz[S] = 1;
	
	for (Q.push (S); !Q.empty (); Q.pop ()) {
		nod = Q.front ();
		viz[nod] = 0;
		
		for (i = 0, N = V[nod].size (); i < N; i++) {
			fiu = V[nod][i];
			if (F[nod][fiu] && C[fiu] > C[nod] + Cst[nod][fiu]) {
				C[fiu] = C[nod] + Cst[nod][fiu];
				T[fiu] = nod;
				
				if (!viz[fiu]) 
					Q.push (fiu), viz[fiu] = 1;
			}
		}
	}
	
	if (C[D] == INF) 
		return 0;
	return 1;
}

int main () {

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

	citire ();
	
	int nod, Fmin;
	while ( Bellman_Ford () ) {
		Fmin = 1 << 30;
		for (nod = D; nod != S; nod = T[nod]) Fmin = min (Fmin, F[ T[nod] ][ nod ]);
		for (nod = D; nod != S; nod = T[nod]) {
			F[T[nod]][nod]-= Fmin;
			F[nod][T[nod]]+= Fmin;
		}
		
		sol+= C[D] * Fmin;
	}
	
	printf ("%d", sol);
	
	return 0;
}