Pagini recente » Cod sursa (job #1151986) | Cod sursa (job #1015122) | Cod sursa (job #2925582) | Cod sursa (job #2605335) | Cod sursa (job #2233220)
#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";
}
}
}