Cod sursa(job #758385)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 15 iunie 2012 15:38:41
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
#define N_MAX 355
#define INF 2000000000
#define FOR(i, v) for(typeof(v.begin()) i = v.begin(); i != v.end(); i++)
queue<int> Q;
vector<int> G[N_MAX];
int C[N_MAX][N_MAX], F[N_MAX][N_MAX], cost[N_MAX][N_MAX];
int Dist[N_MAX];
int T[N_MAX];
bool in[N_MAX];
int n, m, S, D;
int notStop = 1;

void vecini(int x) {
	FOR(i, G[x]) {
		if(F[x][*i] == C[x][*i]) continue;
		if(Dist[*i] > Dist[x] + cost[x][*i]) {
			Dist[*i] = Dist[x] + cost[x][*i];
			T[*i] = x;
			if(!in[*i]) Q.push(*i);
			in[*i] = 1;
		}
	}
}
int BellmanFord() {
	Q.push(S);
	in[S] = 1;
	for(int i = 1; i <= n; i++) {
		Dist[i] = INF;
	}
	Dist[S] = 0;
	while(!Q.empty()) {
		int x = Q.front();
		Q.pop();
		in[x] = 0;
		vecini(x);
	}
	
	if(Dist[D] == INF) return 0;
	notStop = 1;
	int fl = INF;
	for(int x = D; x != S; x = T[x]) {
		fl = min(fl, C[T[x]][x] - F[T[x]][x]);
	}
	for(int x = D; x != S; x = T[x]) {
		F[T[x]][x] += fl;
		F[x][T[x]] -= fl;
	}
	return Dist[D] * fl;
}
void solve() {
	int c = 0;
	while(notStop) {
		notStop = 0;
		c += BellmanFord();
	}
	printf("%d\n", c);
}
void add_muchie(int x, int y, int cap, int co) {
	G[x].push_back(y);
	C[x][y] = cap;
	cost[x][y] = co;
	G[y].push_back(x);
	cost[y][x] = -co;
}
int main() {
	freopen("fmcm.in", "r", stdin);
	freopen("fmcm.out", "w", stdout);
	scanf("%d%d%d%d", &n, &m, &S, &D);
	
	for(int i = 1; i <= m; i++) {
		int x,y,cap,co;
		scanf("%d%d%d%d", &x, &y, &cap, &co);
		add_muchie(x,y,cap,co);
	}
	
	solve();
	return 0;
}