Cod sursa(job #918225)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 18 martie 2013 18:25:34
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <fstream>
#include <iostream>
#include <string>
#include <queue>
#include <vector>
#include <string.h>
#include <iomanip>
using namespace std;


const string file = "fmcm";

const string infile = file + ".in";
const string outfile = file + ".out";


#define MAXN 355
#define INF 1<<29

vector<pair<int, int> > Graf[MAXN];


int Rezidual[MAXN][MAXN];
int Flux[MAXN][MAXN];
int Parrent[MAXN];



int CostMin;
int FluxMax;
int N;
int M;

int S;
int D;

int prec[MAXN];
int dist[MAXN];
int inQ[MAXN];


void citire()
{
	ifstream fin(infile.c_str());

	fin >> N >> M;
	fin >> S >> D;

	for(int i = 0; i < M; i++)
	{
		int x, y , cap, cst;
		fin >> x >> y >> cap >> cst;

		Graf[x].push_back(make_pair(y, cst));
		Graf[y].push_back(make_pair(x, -cst));
		
		Rezidual[x][y] += cap;

	}

	fin.close();
}


bool BellmanFord()
{
	for(int i = 0; i <= N; i++)
	{
		dist[i] = INF;
		prec[i] = 0;
	}

	queue<int> q;

	q.push(S);
	dist[S] = 0;
	inQ[S] = true;

	while(q.empty() == false)
	{
		int current = q.front();
		q.pop();
		inQ[current] = false;
		for (vector<pair<int, int> >::iterator itr = Graf[current].begin();
			 itr != Graf[current].end();
			 itr++)
		{
			int vecin = itr->first;
			int cost = itr->second;

			if(Rezidual[current][vecin] != Flux[current][vecin] && dist[vecin] > dist[current] + cost)
			{
				prec[vecin] = current;
				dist[vecin] = dist[current] + cost;
				if(inQ[vecin] == false)
				{
					inQ[vecin] = true;
					q.push(vecin);
				}
			}

		}

	}

	if(prec[D] == 0)
	{
		return false;
	}
	return true;
}


void solve()
{
	while(BellmanFord())
	{
		int fmin = INF;
		for(int nod = D; nod != S; nod = prec[nod])
		{
			fmin = min(fmin, Rezidual[prec[nod]][nod] - Flux[prec[nod]][nod]);
		}
		for(int nod = D; nod != S; nod = prec[nod])
		{
			Flux[prec[nod]][nod] += fmin;
			Flux[nod][prec[nod]] -= fmin;
		}
		CostMin += fmin * dist[D];
		if(fmin == 0)
			break;
	}
}


void afisare()
{
	ofstream fout(outfile.c_str());

	fout << CostMin << "\n";

	fout << "\n";
	fout.close();
}

int main()
{

	citire();
	solve();
	afisare();
}