Cod sursa(job #328156)

Utilizator savimSerban Andrei Stan savim Data 1 iulie 2009 10:27:01
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <stdio.h>
#include <vector>
#include <string.h>

using namespace std;

#define MAX_N 360
#define inf 2147000000

int n, m, s, d, improve, sol;
int C[MAX_N][MAX_N], F[MAX_N][MAX_N], cost[MAX_N][MAX_N];
int dist[MAX_N], tata[MAX_N], use[MAX_N], Q[MAX_N];
vector <int> v[MAX_N];

void cit() {                      
    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;
		scanf("%d %d", &x, &y);
        scanf("%d %d", &C[x][y], &cost[x][y]);
		cost[y][x] = -cost[x][y];

		v[x].push_back(y);
		v[y].push_back(x);
	}
}

int bf() {
	memset(Q, 0, sizeof(Q));
	memset(use, 0, sizeof(use));

	int st = 0, dr = 1;
	Q[1] = s; use[s] = 1;
	
	while (st != dr) {
		st++;
		if (st > n) st = 1;

		int len = v[Q[st]].size();
		for (int i = 0; i < len; i++) {
			if (C[Q[st]][v[Q[st]][i]] > F[Q[st]][v[Q[st]][i]] && dist[v[Q[st]][i]] > dist[Q[st]] + cost[Q[st]][v[Q[st]][i]]) {
				dist[v[Q[st]][i]] = dist[Q[st]] + cost[Q[st]][v[Q[st]][i]];
				tata[v[Q[st]][i]] = Q[st];

				if (!use[v[Q[st]][i]]) {
					dr++;
					if (dr > n) dr = 1;
						Q[dr] = v[Q[st]][i];
					use[v[Q[st]][i]] = 1;
				}
			}
		}
		use[Q[st]] = 0;
	}

	if (dist[d] < inf) {
		improve = 1;

		int flux = inf;
		for (int i = d; i != s; i = tata[i])
			flux = min(flux, C[tata[i]][i] - F[tata[i]][i]);

		for (int i = d; i != s; i = tata[i]) {
			F[tata[i]][i] += flux;
			F[i][tata[i]] -= flux;
		}

		return flux * dist[d];	
	}
	return 0;
}

void solve() {
    improve = 1;
	while (improve) {
		improve = 0;			

		for (int i = 1; i <= n; i++) {
			dist[i] = inf;
			tata[i] = -1;
		}
		dist[s] = 0;

		sol += bf();
	}

	printf("%d\n", sol);
}

int main() {

	cit();
	solve();

	return 0;
}