Cod sursa(job #139202)

Utilizator raduzerRadu Zernoveanu raduzer Data 19 februarie 2008 20:14:20
Problema Bibel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

#define maxb 17
#define inf 2000000000
vector <int> vx;
vector <int> vy;
vector <int> precx;
vector <int> precy;
vector <int> precd;
vector <int> vdist;

int c,x,y;

int dt(int a,int b)
{
	return ((vx[a]-vx[b])*(vx[a]-vx[b])+(vy[a]-vy[b])*(vy[a]-vy[b]));
}

int dt2(int a,int b)
{
	return ((vx[a]-precx[b])*(vx[a]-precx[b])+(vy[a]-precy[b])*(vy[a]-precy[b]));
}

void proc()
{
	int v[1<<maxb][maxb];
	int i,j;
	for (i=0; i<(1<<(int)vx.size()); ++i)
	{
		for (j=0; j<(int)vx.size(); ++j)
		{
			v[i][j]=inf;
		}
	}
	int mn,x;
	for (i=0; i<(int)vx.size(); ++i)
	{
		for (j=0; j<(int)precx.size(); ++j)
		{
			mn=v[1<<i][i];
			x=dt2(i,j) +precd[j];
			if (mn>x) mn=x;
			v[1<<i][i]=mn;
		}
	}

	int d[maxb][maxb];
	for (i=0; i<(int)vx.size(); ++i)
	{
		for (j=0; j<(int)vx.size(); ++j)
		{
			d[i][j]=dt(i,j);
		}
	}
	for (i=0; i<(1<<(int)vx.size()); ++i)
	{
		int t[maxb],cnt=0;
		for (j=0; j<(int)vx.size(); ++j)
		{
			if (i & (1<<j))
			{
				t[cnt++]=j;
			}
		}
		if (cnt>1)
		for (j=0; j<cnt; ++j)
		{
			i^=1<<t[j];
			int mn=inf;
			for (int k=0; k<cnt; ++k)
			{
				if (k==j) continue;
				mn=v[i ^ (1<<t[j])][t[j]];
				if (mn>v[i][t[k]]+d[t[k]][t[j]]) mn=v[i][t[k]]+d[t[k]][t[j]];
				v[i ^ (1<<t[j])][t[j]]=mn;
			}
			i^=1<<t[j];
		}
	}
	mn=inf;
	for (i=0; i<(int)vx.size(); ++i)
	{
		vdist.push_back(v[(1<<(int)vx.size())-1][i]);
		if (mn>vdist[i]) mn=vdist[i];
	}
	printf("%d\n",mn);
}

int main()
{
	freopen("bibel.in","r",stdin);
	freopen("bibel.out","w",stdout);
	precx.push_back(0);
	precy.push_back(0);
	precd.push_back(0);
	while (1)
	{
		scanf("%d",&c);
		if (c==0)
		{
			scanf("%d%d",&x,&y);
			vx.push_back(x);
			vy.push_back(y);
		}
		if (c==2) return 0;
		if (c==1) 
		{
			proc();
			precx.clear();
			precy.clear();
			precd.clear();
			for (int i=1; i<=(int)vx.size(); ++i) 
			{
				precx.push_back(vx[i]);
				precy.push_back(vy[i]);
				precd.push_back(vdist[i]);
			}
			vx.clear();
			vy.clear();
			vdist.clear();
		}
	}
}