Cod sursa(job #568389)

Utilizator Addy.Adrian Draghici Addy. Data 31 martie 2011 10:00:27
Problema Flux maxim de cost minim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

#define NMAX 365
#define INF 0x3f3f3f3f

bool viz[NMAX];
short int C[NMAX][NMAX], F[NMAX][NMAX], T[NMAX];
int V[NMAX], D, S, sol, n, m;
vector < pair <short int, short int> > G[NMAX];
queue <int> Q;

void citire (), flux_cmin (), afisare ();

int main () {
	
	citire ();
	
	flux_cmin ();
	
	afisare ();

	return 0;
}

bool bellman_ford () {
	
	int nod, fiu, cst;
	vector < pair <short int, short int> >::iterator it;
	
	memset (V, INF, sizeof (V)); memset (viz, 0, sizeof (viz));
	
	Q.push (S), V[S] = 0, viz[S] = 1;
	while (!Q.empty ()) {
		nod = Q.front ();
		for (it = G[nod].begin (); it != G[nod].end (); it++) {
			fiu = it -> first, cst = it -> second;
			
			if (C[nod][fiu] > F[nod][fiu] && V[nod] + cst < V[fiu]) {
				V[fiu] = V[nod] + cst;
				
				T[fiu] = nod;
				
				if (!viz[fiu]) Q.push (fiu), viz[fiu] = 1;
			}
		}
		
		Q.pop (), viz[nod] = 0;
	}
	
	if (V[D] != INF) return 1;
	return 0;
}

void flux_cmin () {
	
	int minim, nod;
	
	while (bellman_ford ()) {
		
		minim = INF;
		
		for (nod = D; T[nod]; nod = T[nod])
			minim = min (minim, C[ T[nod] ][nod] - F[ T[nod] ][nod]);
		
		for (nod = D; T[nod]; nod = T[nod]) {
			F[ T[nod] ][nod] += minim;
			F[nod][ T[nod] ] -= minim;
		}
		
		sol += V[D] * minim;
	}
}

void citire () {
	
	freopen ("fmcm.in", "r", stdin);
	
	int i, x, y, c, z;
	
	scanf ("%d %d %d %d", &n, &m, &S, &D);
	
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d %d", &x, &y, &c, &z);
		G[x].push_back (make_pair (y, z)), G[y].push_back (make_pair (x, -z));
		C[x][y] = c;
	}
}

void afisare () {
	
	freopen ("fmcm.out", "w", stdout);
	
	printf ("%d", sol);
}