Cod sursa(job #2233220)

Utilizator shantih1Alex S Hill shantih1 Data 22 august 2018 17:01:28
Problema Bibel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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[131073][17],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);
}

void calc (int st,int fn)
{
	int k=0,i,h=st-(1<<fn),g=h;
	while(g)
	{
		i=lg[(g^(g-1))&g];
		g&=g-1;
		if(dp[h][i]==inf)	calc(h,i);
		k=dp[h][i]+dis(c[fn].x,c[fn].y,c[i].x,c[i].y);
		if(k<dp[st][fn]) dp[st][fn]=k;
	}
}

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<=l;i++)
				for(j=0;j<n;j++)
					dp[i][j]=inf;
			
			for(i=0;i<n;i++)
			{
				nr=1<<i;
				for(j=0;j<g;j++)
					dp[nr][i]=min(dp[nr][i], w[j]+dis(c[i].x,c[i].y,p[j].x,p[j].y));
			}
			
			for(i=0;i<n;i++)
				calc(l, i);
			
			rez=dp[l][0];
			g=n;
			for(i=0;i<n;i++)
			{
				p[i].x=c[i].x;
				p[i].y=c[i].y;
				w[i]=dp[l][i];
				rez=min(rez,w[i]);
			}
			n=0;
			fout<<rez<<"\n";
		}
	}
}