Cod sursa(job #2829603)

Utilizator betybety bety bety Data 8 ianuarie 2022 19:46:07
Problema Flux maxim de cost minim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 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]) {



	//		printf ("%d ->, ", i);

			matflux[dad[i]][i] += fmin;

			matflux[i][dad[i]] -= fmin;

		}

	//	printf ("\n");

		sol += d[D] * fmin;



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



	}



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

	return 0;

}