Cod sursa(job #2850954)

Utilizator Vlad_AnicaAnica-Popa Vlad-Ioan Vlad_Anica Data 17 februarie 2022 20:26:00
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <cstdio>
#include <vector>
#include <bitset>
#include <queue>
#define inf 1000000000
#define MAXN 355
#define sd short int
#define f first
#define s second
#define VIT vector <pair <sd, sd> > :: iterator

using namespace std;

bitset <MAXN> viz;
vector <pair <sd, sd> > G[MAXN];
int d[MAXN];
sd matCap[MAXN][MAXN], matflux[MAXN][MAXN];
int N, M, S, D;
sd dad[MAXN];
int sol;

inline bool BF ()
{
	queue <int> Q;
	int nod, i;
	viz.reset ();
	Q.push (S);

	for (i = 1; i <= N; i++) {
		dad[i] = 0;
		d[i] = inf;
	}
	d[S] = 0;

	while (!Q.empty ()) {
		nod = Q.front ();
		Q.pop ();

		viz[nod] = 0;
		for (VIT it = G[nod].begin (); it != G[nod].end (); it++)
			if (matCap[nod][it -> f] > matflux[nod][it -> f] && d[it -> f] > d[nod] + it -> s) {
				d[it -> f] = d[nod] + it -> s;
				dad[it -> f] = nod;

				if (viz[it -> f] == 0) {
					viz[it -> f] = 1;
					Q.push (it -> f);
				}
			}
	}
	return d[D] != inf;
}

int main ()
{
	freopen ("fmcm.in", "r", stdin);
	freopen ("fmcm.out", "w", stdout);

	scanf ("%d %d %d %d\n", &N, &M, &S, &D);

	int i, fmin, nod;
	sd x, y, cap, cost;

	while (M--) {
		scanf ("%hd %hd %hd %hd\n", &x, &y, &cap, &cost);

		matCap[x][y] = cap;
		G[x].push_back (make_pair (y, cost));
		G[y].push_back (make_pair (x, -cost));
	}

	while (BF ()) {
		nod = D;
		fmin = inf;
		for (i = nod; i != S; i = dad[i])
			fmin = min (fmin, matCap[dad[i]][i] - matflux[dad[i]][i]);

		if (fmin == 0) continue;

		for (i = nod; i != S; i = dad[i]) {
			matflux[dad[i]][i] += fmin;
			matflux[i][dad[i]] -= fmin;
		}
		sol += d[D] * fmin;

	}

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

	return 0;

}