Cod sursa(job #625266)

Utilizator dacyanMujdar Dacian dacyan Data 24 octombrie 2011 09:37:26
Problema Flux maxim de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <vector>
#include <queue>
#define DIM 360
#define DIM_M 12501
#define INF 0x3f3f3f3f
using namespace std;


int n, m, flux, cst, S, D;
vector<int> G[DIM];
int c[DIM][DIM], f[DIM][DIM], cost[DIM][DIM];
int cr[DIM_M];
vector<int> t;

void Read();
void EK();
bool BF();
void Augment();
void Write();

int main()
{
	Read();
	EK();
	Write();
	return 0;
}

void Read()
{
	ifstream fin("fmcm.in");
	fin >> n >> m >> S >> D;
	int x, y, cap, cos;
	for (int i = 1; i <= m; ++i)
	{
		fin >> x >> y >> cap >> cos;
		G[x].push_back(y);
		G[y].push_back(x);
		c[x][y] = cap; c[y][x] = 0;
		cost[x][y] = cos; cost[y][x] = cos * (-1);
	}
	fin.close();
}

void EK()
{
	while (BF())
		Augment();
	
}

bool BF()
{
	queue<int> Q;
	t.assign(n+1, 0);
	vector<int> d(n+1, INF);
	vector<bool> s(n+1);
	
	d[S] = 1;
	cr[S] = INF;
	Q.push(S);
	while (!Q.empty())
	{
		int i = Q.front();
		Q.pop();
		for (int k = 0; k < G[i].size(); ++k)
		{
			int j = G[i][k];
			if (f[i][j] < c[i][j] && d[j] > d[i] + cost[i][j])
			{
				d[j] = d[i] + cost[i][j];
				cr[j] = min(cr[i], c[i][j] - f[i][j]);
				t[j] = i;
				s[j] = 1;
				Q.push(j);
			}
		}
	}
	if (s[D]) return true;
	return false;
}

void Augment()
{
	int i, j;
	j = D;
	while (j != S)
	{
		i = t[j];
		f[i][j] += cr[D];
		f[j][i] -= cr[D];
		cst += cr[D] * cost[i][j];
		j = i;
	}
	
}

void Write()
{
	ofstream fout("fmcm.out");
	fout << cst << '\n';
	fout.close();
}