Cod sursa(job #1555130)

Utilizator ArkinyStoica Alex Arkiny Data 22 decembrie 2015 12:36:01
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
#include<string.h>
using namespace std;

#define INF (1<<30)
ifstream in("fmcm.in");
ofstream out("fmcm.out");


vector<int> G[351];
queue<int> q;
int N, M,a,b,c,d,rez;
int T[351], D[351], CAP[351][351], COST[351][351], SOURCE, DEST;
bool viz[351];
void Update(int S,int DEST)
{
	int i,j,el;
	int mn = INF;
	el = DEST;
	for (; T[el]; el=T[el])
	{
		mn = min(mn, CAP[T[el]][el]);
	}
	el = DEST;
	for (; T[el]; el = T[el])
	{
		if (CAP[T[el]][el] - mn >= 0)
		{
			CAP[T[el]][el] -= mn;
			CAP[el][T[el]] += mn;
		}
		else
		{
			CAP[T[el]][el] += mn;
			CAP[el][T[el]] -= mn;
		}
	}
	rez += D[DEST] * mn;
}
int BellmanFord(int S,int DEST)
{
	int el,i;
	for (i = 1; i <= N; ++i)
	{
		D[i] = INF;
		T[i] = 0;
	}
	D[S] = 0;
	memset(viz, 0, sizeof(viz));
	viz[S] = 1;
	q.push(S);
	int ok=0;
	while (q.size())
	{
		el = q.front();
		q.pop();
		viz[el] = 0;
		for (i = 0; i < G[el].size(); ++i)
			if (D[el] + COST[el][G[el][i]] < D[G[el][i]] && CAP[el][G[el][i]]>0)
			{
				D[G[el][i]] = D[el] + COST[el][G[el][i]];
				T[G[el][i]] = el;
				ok = 1;
				if (!viz[G[el][i]])
				{
					viz[G[el][i]] = 1;
					q.push(G[el][i]);
				}
			}
	}
	return ok;
}
void EdmondKarp(int S,int DEST)
{
	while (BellmanFord(S,DEST))
	{
		Update(S,DEST);
	}
}
int main()
{
	in >> N >> M>>SOURCE>>DEST;
	for (int i = 1; i <= M; ++i)
	{
		in >> a >> b >> c >> d;
		G[a].push_back(b);
		CAP[a][b] = c;
		COST[a][b] = d;
		COST[b][a] = -d;
	}
	EdmondKarp(SOURCE, DEST);
	out << rez;
	return 0;
}