Cod sursa(job #2476399)

Utilizator gabib97Gabriel Boroghina gabib97 Data 18 octombrie 2019 19:43:14
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <stdio.h>

#include <vector>

#include <queue>

#include <string.h>

#define inf 500000000

using namespace std;

int n, m, i, k, x, y, z, d[405], t[405], f[405][405], c[405][405], r, cost, j, s, dv[405], dn[405], D, e, a;

bool o[405];
vector<pair<int, int> > G[405];
queue<int> Q;
priority_queue<pair<int, int>, vector<pair<int, int> >, greater<pair<int, int> > > H;

void citire()
{
	int i, cp;
	scanf("%i%i%i%i", &n, &m, &s, &e);
	for (i = 1; i <= m; i++) {
		scanf("%i%i%i%i", &x, &y, &cp, &z);
		c[x][y] = cp;
		G[x].push_back(make_pair(y, z));
		G[y].push_back(make_pair(x, -z));
	}
}

void bellmanford()
{
	int i, z, x, y;
	for (i = 1; i <= n; i++) dv[i] = inf;
	Q.push(s);
	o[s] = 1;
	dv[s] = 0;
	while (!Q.empty()) {
		x = Q.front();
		Q.pop();
		o[x] = 0;
		z = G[x].size();
		for (i = 0; i < z; i++) {
			y = G[x][i].first;
			if (c[x][y] - f[x][y] > 0 && dv[y] > dv[x] + G[x][i].second) {
				dv[y] = dv[x] + G[x][i].second;
				if (!o[y]) {
					Q.push(y);
					o[y] = 1;
				}
			}
		}
	}
}

bool dijkstra()
{
	int i, z, x, y;
	pair<int, int> p;
	for (i = 0; i <= n; i++) d[i] = inf;
	H.push(make_pair(0, s));
	d[s] = 0;
	dn[s] = 0;
	while (!H.empty()) {
		p = H.top();
		H.pop();
		x = p.second;
		if (d[x] != p.first) continue;
		z = G[x].size();
		for (i = 0; i < z; i++) {
			y = G[x][i].first;
			D = d[x] + G[x][i].second + dv[x] - dv[y];
			if (c[x][y] - f[x][y] > 0 && d[y] > D) {
				d[y] = D;
				dn[y] = dn[x] + G[x][i].second;
				t[y] = x;
				H.push(make_pair(D, y));
			}
		}
	}
	memcpy(dv,dn,sizeof(dn));
	return !(d[e] == inf);
}

int main()
{
	freopen("fmcm.in", "r", stdin);
	freopen("fmcm.out", "w", stdout);
	citire();
	bellmanford();
	while (dijkstra()) {
		r = inf;
		a++;
		for (i = e; i != s; i = t[i]) r = min(r, c[t[i]][i] - f[t[i]][i]);
		cost += r * dn[e];
		for (i = e; i != s; i = t[i]) {
			f[t[i]][i] += r;
			f[i][t[i]] -= r;
		}
	}
	printf("%i", cost);
	fclose(stdin);
	fclose(stdout);
	return 0;

}