Pagini recente » Cod sursa (job #338872) | Cod sursa (job #1366594) | Cod sursa (job #3244128) | Cod sursa (job #686234) | Cod sursa (job #1874912)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define N 17
#define INF 2000000000
using namespace std;
struct poz {
int x , y ;
};
poz cr [ N ] , old[ N ] ;
int distold [ N ];
int dp [ 1 << ( N + 1 ) ][ N ];
int predist [ N ][ N ];
int n , nold ;
int dist ( poz a , poz b ){
return ( a.x - b.x )*( a.x - b.x ) + ( a.y - b.y )*( a.y - b.y );
}
void solve (){
static int i , j , k , vmax ;
for ( i = 0 ; i < ( 1 << ( n + 1 ) ) ; i++ ){
for ( j = 0 ; j <= n ; j ++ ){
dp [ i ][ j ] = INF ;
}
}
for ( i = 0 ; i <= nold ; i++ ){
for ( j = 0 ; j <= n ; j ++ ){
dp [ 1 << j ][ j ] = min( dp [ 1 << j ][ j ] , distold [ i ] + dist ( cr [ j ] , old [ i ] ) );
}
}
for ( i = 0 ; i <= n ; i ++ ){
for ( j = 0 ; j <= n ; j++ ){
predist [ i ][ j ] = dist( cr [ i ] , cr [ j ] );
}
}
for ( i = 1 ; i < ( 1 << ( n + 1 ) ) - 1 ; i ++ ){
for ( j = 0 ; j <= n ; j ++ ){
// j e punctul pe care urmeaza sa il calculam folosindu-ne de k
if ( ( 1 << j ) & i ){
continue ;
}
for ( k = 0 ; k <= n ; k ++ ){
if ( ! ( ( 1<<k ) & i ) ){
continue ;
}
if ( k == j ){
continue ;
}
dp [ i + (1<<j) ][ j ] = min ( dp [ i + ( 1<<j ) ][ j ] , dp [ i ][ k ] + predist [ k ][ j ] );
}
}
}
vmax = INF ;
for ( i = 0 ; i <= n ; i++ ){
vmax = min( vmax , dp [ (1<<( n + 1 ) ) - 1 ][ i ] );
distold [ i ] = dp [ (1<<( n + 1 ) ) - 1 ][ i ] ;
old [ i ] = cr [ i ] ;
}
nold = n ;
n = 0;
printf("%d\n",vmax);
}
int main(){
int type ;
freopen("bibel.in","r",stdin);
freopen("bibel.out","w",stdout);
nold = 1;
while ( 3 ){
scanf("%d",&type );
if ( type == 1 ){
n--;
solve ();
continue;
}else if ( type == 2 ){
return 0 ;
}
scanf("%d%d",&cr [ n ].x , &cr [ n ].y );
n++ ;
}
return 0;
}