Pagini recente » Cod sursa (job #2834006) | Cod sursa (job #1460581) | Cod sursa (job #579448) | Cod sursa (job #2893547) | Cod sursa (job #2119593)
#include <bits/stdc++.h>
#define INF 100000
using namespace std;
ifstream fin("bibel.in") ;
ofstream fout("bibel.out") ;
int n , prec , nivel = 1 ;
int dp[1<<18][18] ;
int x[20],y[20],xx[20],yy[20] ;
int calc(int x1,int y1,int x2,int y2)
{
return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}
void hamilton()
{
if ( nivel == 1 )
prec = n ;
int i , j , sol , k ;
for ( i = 1 ; i < (1<<n) ; i++ )
for ( j = 0 ; j < n ; j++ )
dp[i][j] = INF ;
for ( i = 0 ; i < prec ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
dp[(1<<j)][j] = min(dp[(1<<j)][j],dp[0][i]+calc(xx[i],yy[i],x[j],y[j])) ;
//cout << dp[(1<<j)][j] << " " ;
}
//cout << endl ;
}
for ( i = 1 ; i < (1<<n) ; i++ )
{
for ( j = 0 ; j < n ; j++ )
{
if ( (i&(1<<j)) != 0 )
{
for ( k = 0 ; k < n ; k++ )
{
if ( (i&(1<<k)) == 0 && k != j )
dp[i|(1<<k)][k] = min(dp[i][j]+calc(x[k],y[k],x[j],y[j]),dp[i|(1<<k)][k]) ;
}
}
}
}
sol = INF ;
for ( i = 0 ; i < n ; i++ )
{
sol = min(sol,dp[((1<<n)-1)][i]) ;
xx[i] = x[i] ;
yy[i] = y[i] ;
dp[0][i] = dp[((1<<n)-1)][i] ;
}
prec = n ;
nivel++ ;
n = 0 ;
fout << sol << '\n';
}
int main()
{
int p , a , b ;
n = 0 ;
while(!fin.eof())
{
p = 2;
fin >> p ;
if ( p == 0 )
{
fin >> a >> b ;
x[n] = a ;
y[n] = b ;
n++;
}
else if ( p == 1 )
hamilton() ;
}
}