Cod sursa(job #2233062)

Utilizator shantih1Alex S Hill shantih1 Data 22 august 2018 01:36:49
Problema Bibel Scor 95
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;
long long dp[17][131073],w[20],inf,rez;
int v[20];

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

long long dis (int c1,int c2,int k1,int k2)
{
	return (c1-k1)*(c1-k1)+(c2-k2)*(c2-k2);
}

long long calc (int fn,int st)
{
	if(dp[fn][st]==inf)
	{
		if((st&(st-1))==0)	return 0;
		long long k=0;
		int i;
		
		for(i=0;i<n;i++)
			if((st&(1<<i)) && i!=fn)
			{
				k=calc(i, st-(1<<fn))+dis(c[fn].x,c[fn].y,c[i].x,c[i].y);
				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=(1LL<<62);
	
	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(c[i].x,c[i].y,p[j].x,p[j].y));
			}
			
			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";
		}
	}
}