Cod sursa(job #476139)

Utilizator vlad.maneaVlad Manea vlad.manea Data 9 august 2010 22:49:23
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
#include <vector>
#include <queue>

#define Nmax 256

using namespace std;

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

void read()
{
	int i, j, c;
	ifstream fin("cc.in");

	fin >> N;

	for (i = 1; i <= N; ++i)
	{
		for (j = 1; j <= N; ++j)
		{
			fin >> Cst[i][j + N];
		}
	}

	fin.close();
}

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

	for (i = 1, n = N << 1 | 1; i <= n; ++i)
	{
		Dst[i] = M;
	}

	Q.push(0);

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

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

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

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

		Q.pop();
	}

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

	A += Dst[n];

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

	return true;
}

void solve()
{
	int i, j, n;

	M = numeric_limits<int>::max();
	
	for (i = 1; i <= N; ++i)
	{
		for (j = 1; j <= N; ++j)
		{
			Deg[i].push_back(j + N);
			Deg[j + N].push_back(i);
			Cap[i][j + N] = 1;
			Cst[j + N][i] = -Cst[i][j + N];
		}
	}

	for (i = 1, n = N << 1 | 1; i <= N; ++i)
	{
		Deg[0].push_back(i);
		Deg[i].push_back(0);
		Cap[0][i] = 1;
		Deg[i + N].push_back(n);
		Deg[n].push_back(i + N);
		Cap[i + N][n] = 1;
	}

	while (flow());
}

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

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

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