Pagini recente » Cod sursa (job #2642517) | Cod sursa (job #2827102) | Cod sursa (job #59657) | Cod sursa (job #2538276) | Cod sursa (job #1144623)
#include<cstdio>
#define inf (1LL<<31)-1
#define NMax 20
using namespace std;
int V[1<<NMax][NMax];
int N,NPrc,CPrc[NMax];
struct Punct { int x,y; };
Punct A[NMax],prc[NMax];
int mini (int x, int y)
{
return (x<y) ? x : y;
}
int dist (Punct P1, Punct P2)
{
return (P1.x-P2.x)*(P1.x-P2.x)+(P1.y-P2.y)*(P1.y-P2.y);
}
int solve ()
{
int i,j,k,min=inf;
for (i=0; i<(1<<N); i++)
for (j=0; j<N; j++)
V[i][j]=inf;
for (i=0; i<N; i++)
for (j=0; j<NPrc; j++)
V[1<<i][i]=mini(V[1<<i][i],CPrc[j]+dist(prc[j],A[i]));
for (i=0; i<(1<<N); i++)
for (j=0; j<N; j++)
if ((1<<j) & i)
for (k=0; k<N; k++)
if ((1<<k) & i)
V[i][j]=mini(V[i][j],V[i^(1<<j)][k]+dist(A[k],A[j]));
for (i=0; i<N; i++)
{
if (V[(1<<N)-1][i]<min)
min=V[(1<<N)-1][i];
CPrc[i]=V[(1<<N)-1][i];
prc[i]=A[i];
}
NPrc=N;
return min;
}
int main ()
{
int tip,crt=0,stare=1;
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
NPrc=1;
while (stare)
{
scanf("%d",&tip);
if (!tip)
scanf("%d%d",&A[crt].x,&A[crt].y), crt++;
else if (tip==1)
N=crt, printf("%d\n",solve()), crt=0;
else
stare=0;
}
return 0;
}