Cod sursa(job #476127)

Utilizator vlad.maneaVlad Manea vlad.manea Data 9 august 2010 21:26:26
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <queue>
#define Nmax 355

using namespace std;

int N, M, S, D, A;
int Cap[Nmax][Nmax], Cst[Nmax][Nmax], Flw[Nmax][Nmax], Dst[Nmax], Ftr[Nmax], Mxf[Nmax];
vector<int> Deg[Nmax];
queue<int> Q;

void read()
{
	int x, y, c, z;
	ifstream fin("fmcm.in");

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

	while (M--)
	{
		fin >> x >> y >> c >> z;
		Deg[x].push_back(y);
		Deg[y].push_back(x);
		Cap[x][y] = c;
		Cst[x][y] = z;
		Cst[y][x] = -z;
	}

	fin.close();
}

bool flow()
{
	int i, u, v;
	vector<int>::iterator j;

	for (i = 1; i <= N; ++i)
	{
		Dst[i] = M;
		Mxf[i] = 0;
	}

	Dst[S] = 0;
	Mxf[S] = M;
	Q.push(S);

	while (!Q.empty())
	{
		u = Q.front();

		for (j = Deg[u].begin(); j != Deg[u].end(); ++j)
		{
			v = *j;

			if (Cap[u][v] > Flw[u][v] && Dst[v] > Dst[u] + Cst[u][v])
			{
				Dst[v] = Dst[u] + Cst[u][v];
				Mxf[v] = min(Mxf[u], Cap[u][v] - Flw[u][v]);
				Ftr[v] = u;

				if (v != D)
				{
					Q.push(v);
				}
			}
		}
		
		Q.pop();
	}

	if (Dst[D] == M)
	{
		return false;
	}

	i = Mxf[D];
	A += Dst[D] * i;

	for (v = D, u = Ftr[D]; v != S; v = u, u = Ftr[u])
	{
		Flw[u][v] += i;
		Flw[v][u] -= i;
	}

	return true;
}

void solve()
{
	M = numeric_limits<int>::max();

	while (flow());
}

void write()
{
	ofstream fout("fmcm.out");

	fout << A << '\n';
	fout.close();
}

int main()
{
	read();
	solve();
	write();
	return 0;
}