Cod sursa(job #2233070)

Utilizator shantih1Alex S Hill shantih1 Data 22 august 2018 06:13:26
Problema Bibel Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <fstream>

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

int n,i,j,a,nr,g,l;
int dp[17][131073],w[20],inf,rez;
int v[20], lg[131073];

struct coord
{   int x, y;   } c[20], p[20];

int dis (int i,int j)
{
	return (c[i].x-c[j].x)*(c[i].x-c[j].x)+(c[i].y-c[j].y)*(c[i].y-c[j].y);
}

int calc (int fn,int st)
{
	if(dp[fn][st]==inf)
	{
		int k=0,i,g=st;
		while(g)
		{
			i=lg[(g^(g-1))&g];
			g&=g-1;
			if(i!=fn)
			{
				k=calc(i, st^(1<<fn))+dis(fn,i);
				if(k<dp[fn][st]) dp[fn][st]=k;
			}
		}
	}
	return dp[fn][st];
}

int main() {
	
	g++;
	w[g]=0;
	p[g].x=0;   p[g].y=0;
	inf=(1<<30);
	
	j=(1<<17);
	lg[1]=0;
	for(i=2;i<=j;i<<=1)
		lg[i]=lg[i/2]+1;
	
	while(fin>>a)
	{
		if(a==0)
		{
			fin>>c[n].x;
			fin>>c[n].y;
			n++;
		}
		if(a==1)
		{
			l=(1<<n)-1;
			for(i=0;i<n;i++)
				for(j=0;j<=l;j++)
					dp[i][j]=inf;
			
			for(i=0;i<n;i++)
			{
				nr=1<<i;
				for(j=0;j<g;j++)
					dp[i][nr]=min(dp[i][nr], w[j]+dis(i,j));
			}
			
			for(i=0;i<n;i++)
				dp[i][l]=calc(i, l);
			
			rez=dp[0][l];
			g=n;
			for(i=0;i<n;i++)
			{
				p[i].x=c[i].x;
				p[i].y=c[i].y;
				w[i]=dp[i][l];
				rez=min(rez,w[i]);
			}
			n=0;
			fout<<rez<<"\n";
		}
	}
}