Cod sursa(job #1536982)

Utilizator deividFlorentin Dumitru deivid Data 26 noiembrie 2015 20:22:56
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <stdio.h>
#include <vector>
#include <queue>

#define maxdim 353

using namespace std;

int n, m, source, dest;
int viz[maxdim], dist[maxdim], T[maxdim];
int cap[maxdim][maxdim], f[maxdim][maxdim], cost[maxdim][maxdim];
vector<int> G[maxdim];

int bf() {

	queue<int> q;
	for (int i = 1; i <= n; ++i) {
		viz[i] = 0;
		dist[i] = 1<<29;
	}
	
	q.push(source);
	viz[source] = 1;
	dist[source] = 0;
	while (!q.empty()) {
		int nod = q.front(); q.pop(); viz[nod] = 0;
		for (int vecin : G[nod]) {
			if (cap[nod][vecin] > f[nod][vecin] && dist[vecin] > dist[nod] + cost[nod][vecin]) {
				dist[vecin] = dist[nod] + cost[nod][vecin];
				T[vecin] = nod;
				if (!viz[vecin]) {
					q.push(vecin);
					viz[vecin] = 1;
				}
			}
		}
	}
	
	return dist[dest];
}

int main() {
	
	freopen("fmcm.in", "r", stdin);
	freopen("fmcm.out", "w", stdout);
	
	scanf("%d %d %d %d", &n, &m, &source, &dest);
	for (int i = 1; i <= m; ++i) {
		int x, y, c, z;
		scanf("%d %d %d %d", &x, &y, &c, &z);
		G[x].push_back(y); cap[x][y] = c; cost[x][y] = z;
		G[y].push_back(x); cost[y][x] = -z;
	}
	
	int sol = 0;
	while (bf() != (1<<29)) {
		int nod = dest;
		int maxf = 1<<29, minc = 0;
		while (nod != source) {
			maxf = min(maxf, cap[T[nod]][nod] - f[T[nod]][nod]);
			minc += cost[T[nod]][nod];
			nod = T[nod];
		}
		nod = dest;
		while (nod != source) {
			f[T[nod]][nod] += maxf;
			f[nod][T[nod]] -= maxf;
			nod = T[nod];
		}
		sol += maxf * minc;
	}
	
	printf("%d\n", sol);

	return 0;
}