Pagini recente » Cod sursa (job #55824) | Cod sursa (job #599233) | Cod sursa (job #344) | Cod sursa (job #627023) | Cod sursa (job #362660)
Cod sursa(job #362660)
#include<stdio.h>
#define minim(a,b) ((a < b) ? a : b)
#define ll long long
typedef struct { int x, y; } punct;
int n, nant;
punct v[32],ant[32];
ll M[1<<17][17],sol[17],solnou[17],bst;
int bit(int x, int nr)
{
if (x & (1<<nr))
return 1;
return 0;
}
ll sqr(ll x)
{ return x * x; }
ll pd(int startx, int starty)
{
int i,j,k;
ll bst;
M[0][0] = 0;
for (j=0;j<n;j++)
M[0][j]=((ll)1<<60);
for (i = 1; i < (1<<n); i++)
for (j = 0; j<n; j++)
{
M[i][j] = ((ll)1<<60);
if (i == (1<<j)) // i contine un singur element, pe j
{
M[i][j] = sqr(v[j].x-startx) + sqr(v[j].y-starty);
continue;
}
if (bit(i, j)) // j apartine multimii i
for (k = 0; k < n; k++)
if (bit(i-(1<<j), k))
{
ll dst = M[i-(1<<j)][k] + sqr(v[j].x-v[k].x) + sqr(v[j].y-v[k].y);
M[i][j] = minim(M[i][j], dst);
}
}
bst=((ll)1<<60);
for (j=0;j<n;j++)
bst=minim(bst,M[(1<<n)-1][j]);
return bst;
}
int main ()
{
int t,j,k,nivel=0;
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
while(1)
{
scanf("%d",&t);
if(t==2)
return 0;
if(t==0)
{
scanf("%d %d", &v[n].x, &v[n].y);
n++;
continue;
}
if (nivel==0)
{
bst = pd(0, 0);
for(j=0;j<n;j++)
solnou[j]=M[(1<<n)-1][j];
}
else
{
bst = ((ll)1<<60);
for(j=0;j<n;j++)
solnou[j]=((ll)1<<60);
for(j=0;j<nant;j++)
{
ll c=sol[j]+pd(ant[j].x,ant[j].y);
for (k=0;k<n;k++)
solnou[k] = minim(solnou[k], sol[j]+M[(1<<n)-1][k]);
bst = minim(bst, c);
}
}
printf("%lld\n", bst);
nivel++;
nant=n;
for(j=0;j<n;j++)
{
ant[j].x=v[j].x;
ant[j].y=v[j].y;
}
for(j=0;j<n;j++)
sol[j]=solnou[j];
n=0;
}
return 0;
}