Cod sursa(job #712939)

Utilizator dacyanMujdar Dacian dacyan Data 13 martie 2012 22:30:03
Problema Cc Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <fstream>
#include <vector>
#include <set>
#define DIM 103
#define INF 0x3f3f3f3f
using namespace std;

ofstream fout("cc.out");

int n, S, D, cost_tot;
int c[DIM][DIM], cost[DIM][DIM], f[DIM][DIM];
vector<int> t;

void EK();
void Augment();
bool Dijkstra();
void Build();
void Read();
void Write();
void Build();

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

void Read()
{
	ifstream fin("cc.in");
	fin >> n;
	int val;
	for (int i = 1; i <= n; ++i)
		for (int j = 1; j <= n; ++j)
		{
			fin >> val;
			cost[i][j+n] = val;
			cost[j+n][i] = val * (-1);
			c[i][j+n] = 1;
			c[j+n][i] = 0;
		}
	fin.close();
}

void EK()
{
	Build();
	while (Dijkstra())
		Augment();
}

void Build()
{
	S = 0; D = 2 * n + 1;
	for (int i = 1; i <= n; ++i)
	{
		c[S][i] = 1; c[i][S] = 0;
		c[i+n][D] = 1; c[D][i+n] = 0;
	}
}

bool Dijkstra()
{
	t.assign(D+1, 0);
	set<pair<int, int> > T;
	vector<int> d(D+1, INF);
	d[S] = 0;
	T.insert(make_pair(0, S));
	while (!T.empty())
	{
		set<pair<int, int> >::iterator it = T.begin();
		int val = it->first;
		int nod = it->second;
		T.erase(it);
		for (int i = S; i <= D; ++i)
		{
			if (nod == i) continue;
			
			if (c[nod][i] > f[nod][i] && d[i] > d[nod] + cost[nod][i])
			{
				d[i] = d[nod] + cost[nod][i];
				t[i] = nod;
				T.insert(make_pair(d[i], i));
			}
		}
	}
//	for (int i = S; i <= D; ++i)
	//	fout << d[i] << ' ';
	//fout << cost[5][10];

	if (d[D] != INF) 
		return true;
	return false;
}

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

void Write()
{
//	ofstream fout("cc.out");
	fout << cost_tot << '\n';
	fout.close();
}