Cod sursa(job #421092)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 21 martie 2010 09:26:57
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
#define NMAX 355
#define FOR(i, v) for(vector<int>::iterator i = v.begin(); i != v.end(); ++i)
#define INF 2000000000
vector <int> G[NMAX];
queue <int> q;
int C[NMAX][NMAX], F[NMAX][NMAX], cost[NMAX][NMAX];
int D[NMAX], in[NMAX], T[NMAX];
int n, m, s, d, ok;
void relax(int x){
	FOR(i, G[x])
		if(C[x][*i] - F[x][*i]>0 && D[*i] > D[x] + cost[x][*i]){
			D[*i] = D[x] + cost[x][*i];
			T[*i] = x;
			if(!in[*i]) q.push(*i);
			in[*i] = 1;
		}
}
int bf(){
	for(int i = 1; i <= n; ++i){
		D[i] = INF;
		in[i] = 0;
	}
	q.push(s);
	D[s] = 0;
	while(!q.empty()){
		int nod = q.front();
		q.pop();
		in[nod] = 0;
		if(nod == d) continue;
		relax(nod);
	}
	if(D[d] == INF) return 0;
	ok = 1;
	int flux = INF;
	for(int x = d; x != s; x = T[x])
		flux = min(flux, C[T[x]][x] - F[T[x]][x]);
	for(int x = d; x != s; x = T[x]){
		F[T[x]][x] += flux;
		F[x][T[x]] -= flux;
	}
	return D[d] * flux;
}
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, z, c;
		scanf("%d%d%d%d",&x, &y, &z, &c);
		G[x].push_back(y); G[y].push_back(x);
		C[x][y] = z;
		cost[y][x] = -(cost[x][y] = c);
	}
	ok = 1;
	int sol = 0;
	while(ok){
		ok = 0;
		sol += bf();
	}
	printf("%d\n", sol);
	return 0;
}