Pagini recente » Cod sursa (job #1332934) | Cod sursa (job #1287757) | Cod sursa (job #285063) | Cod sursa (job #1881535) | Cod sursa (job #2233209)
#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";
}
}
}