Cod sursa(job #2233209)

Utilizator shantih1Alex S Hill shantih1 Data 22 august 2018 16:22:53
Problema Bibel Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 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 c1,int c2,int k1,int k2)
{
	return (c1-k1)*(c1-k1)+(c2-k2)*(c2-k2);
}

int calc (int fn,int st)
{
	if(dp[fn][st]==inf)
	{
		int k=0,i,h=st-(1<<fn);
		int g=h;
		while(g)
		{
			i=lg[(g^(g-1))&g];
			g&=g-1;
			k=calc(i, h)+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=(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(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";
		}
	}
}