Pagini recente » Cod sursa (job #1401959) | Cod sursa (job #2971499) | Cod sursa (job #1822008) | Cod sursa (job #252961) | Cod sursa (job #117410)
Cod sursa(job #117410)
#include <cstdio>
const int Nmax = 17;
const int MAX = (1<<32) - 1;
#define fin "bibel.in"
#define fout "bibel.out"
#define DxBG
#define FL
unsigned int dp[Nmax][1<<Nmax];
int N1,N2,x1[Nmax],y1[Nmax],x2[Nmax],y2[Nmax];
unsigned int sol[Nmax];
int dist(int xa,int ya,int xb,int yb)
{
return (xa - xb) * (xa - xb) + (ya - yb) * (ya - yb);
}
unsigned int min(unsigned int a,unsigned int b)
{
if ( a < b )
return a;
else
return b;
}
int main()
{
int i,j,k,dumi=0;
unsigned int ret;
// printf("%d\n",sizeof(dp)/1024);
freopen(fin,"r",stdin);
#ifdef FL
freopen(fout,"w",stdout);
#endif
N1 = 1 ;
for (;;)
{
scanf("%d",&dumi);
if ( dumi == 2 )
break;
N2 = 0 ;
while ( dumi == 0 )
{
scanf("%d%d",&x2[N2],&y2[N2]);
++N2;
scanf("%d",&dumi);
}
for ( i = 0 ; i < N2 ; ++i )
for ( j = 0 ; j < (1<<N2); ++j)
dp[i][j] = MAX;
for ( i = 0 ; i < N2 ; ++i )
{
dp[i][1<<i]=MAX;
for ( j = 0 ; j < N1 ; ++j )
dp[i][1<<i]=min(dp[i][1<<i],sol[j] + dist(x2[i],y2[i],x1[j],y1[j]) );
}
for ( k = 0 ; k < ( 1 << N2 ) ; ++k)
for ( i = 0 ; i < N2 ; ++i )
for ( j = 0 ; j < N2 ; ++j )
if ( ( ( k & ( 1 << i ) ) == 0 ) && ( k & ( 1 << j ) ) && dp[j][k] < MAX )
dp[i][k | ( 1 << i )] = min( dp[i][k | ( 1 << i )] , dp[j][k] + dist(x2[i],y2[i],x2[j],y2[j]) );
#ifdef DBG
for ( i = 0 ; i < N2 ; ++i)
{
for ( j = 0 ; j < ( 1 << N2 ) ; ++j)
if ( dp[i][j] < MAX )
printf("%u ",dp[i][j]);
else
printf("x ");
printf("\n");
}
#endif
ret = MAX;
for ( i = 0 ; i < N2 ; ++i )
{
x1[i] = x2[i];
y1[i] = y2[i];
sol[i] = dp[i][(1<<N2)-1];
ret = min(ret,sol[i]);
}
N1 = N2;
printf("%u\n",ret);
}
return 0;
}