Cod sursa(job #758590)

Utilizator SzakatsSzakats Istvan Szakats Data 16 iunie 2012 02:02:26
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
#include <stdio.h>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <deque>
#include <queue>
#include <string.h>

using namespace std;

typedef pair<int, int> PII;

#ifdef _WIN32
#define TYPEOF decltype
#else
#define TYPEOF typeof
#endif

#define FOR(i,s,e) for(int i = s;i < e; i++)
#define TR(i, c) for(TYPEOF(c.begin()) i = c.begin(); i != c.end(); ++i)
#define TRS(i, c, ...) TR(__itr, c) { TYPEOF(*c.begin()) &i = *__itr;  __VA_ARGS__ }
#define TRP(f, s, c, ...) TR(__itr, c) { TYPEOF(c.begin()->first) &f = __itr->first; TYPEOF(c.begin()->second) &s = __itr->second;  __VA_ARGS__ }

int N,M,S,D;

#define INF 0x7F7F7F7F

#define MAX_N 360
#define MAX_M 12600

int C[MAX_N][MAX_N], Z[MAX_N][MAX_N], F[MAX_N][MAX_N];
vector<int> G[MAX_N];

queue<int> Q;
int inQ[MAX_N], Dist[MAX_N], P[MAX_N];

int bellford()
{
	memset(inQ, 0, sizeof(inQ));
	memset(Dist, INF, sizeof(Dist));
	Q.push(S);
	inQ[S] = 1;
	Dist[S] = 0;
	while(!Q.empty()) {
		int na = Q.front();
		inQ[na] = 0;
		Q.pop();
		FOR(i,0,G[na].size()) {
			int nb = G[na][i];
			int c = C[na][nb], f = F[na][nb], z = Z[na][nb];
			if(c == f || Dist[nb] <= Dist[na] + z) continue;
			Dist[nb] = Dist[na] + z;
			P[nb] = na;
			if(!inQ[nb]) {
				inQ[nb] = 1;
				Q.push(nb);
			}
		}
	}
	return Dist[D] != INF;
}

int main()
{
#if 1
	freopen("fmcm.in", "r", stdin);
#ifndef MY_STUFF
	freopen("fmcm.out", "w", stdout);
#endif
#endif

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

	FOR(i,0,M) {
		int x,y,z,c;
		scanf("%d %d %d %d", &x, &y, &c, &z);

		G[x].push_back(y);
		G[y].push_back(x);
		C[x][y] = c;
		Z[x][y] = z;
		Z[y][x] = -z;
	}

	int flow = 0, cost = 0;
	while(bellford()) {
		int fmin = INF, nod;
		for(nod = D; nod != S; nod = P[nod]) {
			int c = C[ P[nod] ][nod], f = F[ P[nod] ][nod];
			fmin = min(fmin, c - f);
		}

		for(nod = D; nod != S; nod = P[nod]) {
			F[ P[nod] ][ nod ] += fmin;
			F[ nod ][ P[nod] ] -= fmin;
		}
		flow += fmin;
		cost += fmin * Dist[D];
	}

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

	return 0;
}