Cod sursa(job #389792)

Utilizator Mishu91Andrei Misarca Mishu91 Data 2 februarie 2010 11:30:43
Problema Bibel Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <fstream>
#include <vector>

using namespace std;

#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
#define a first
#define b second

const int MAX_N = 20;
const int MAX_L = (1 << 17);
const int INF = 0x3f3f3f3f;

ifstream fin ("bibel.in");
ofstream fout ("bibel.out");

struct ant
{
	int x, y, c;
};

int N, M, C[MAX_L][MAX_N], D[MAX_N][MAX_N];

vector <pair<int, int> > V;
vector <ant> Ant;

void solve()
{
	N = V.size();
	M = (1 << N);

	for(int i = 0; i < N; ++i)
		for(int j = 0; j < N; ++j)
			D[i][j] = (V[i].a - V[j].a)*(V[i].a - V[j].a) + (V[i].b - V[j].b)*(V[i].b - V[j].b);

	memset(C, INF, sizeof C);
	for(int i = 0; i < N; ++i)
		foreach(Ant)
		{
			int x = it -> x;
			int y = it -> y;
			int c = it -> c;

			C[(1 << i)][i] = min(C[(1 << i)][i], c + (V[i].a - x)*(V[i].a - x) + (V[i].b - y)*(V[i].b - y));
		}

	for(int i = 1; i < M; ++i)
		for(int j = 0; j < N; ++j)
			if(i & (1 << j))
				for(int k = 0; k < N; ++k)
					if(!(i & (1 << k)))
						C[i | (1 << k)][k] = min(C[i | (1 << k)][k], C[i][j] + D[j][k]);

	int Sol = INF;
	ant t;

	Ant.clear();
	for(int i = 0; i < N; ++i)
	{
		Sol = min(Sol, C[M-1][i]);

		t.x = V[i].a, t.y = V[i].b, t.c = C[M-1][i];
		Ant.push_back(t);
	}
	V.clear();
	fout << Sol << "\n";
}

int main()
{
	ant t;
	t.x = t.y = t.c = 0;
	Ant.push_back(t);

	int p;
	for(fin >> p; p != 2; fin >> p)
	{
		if(p == 1) solve();
		else
		{
			int a, b;
			fin >> a >> b;
			V.push_back(make_pair(a, b));
		}
	}
}