Pagini recente » Cod sursa (job #2648768) | Cod sursa (job #3004974) | Cod sursa (job #2124702) | Cod sursa (job #848991) | Cod sursa (job #3207321)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ( "bibel.in" );
ofstream fout ( "bibel.out" );
const int N = 18;
int dp[( 1 << N ) + 10][N + 10], dp0[N + 10];
struct bile {
int x, y;
} v[N + 10], v0[N + 10];
int dist ( bile a, bile b ) {
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
int solve ( int n, int n0 ) {
for ( int stare = 0; stare < (1 << n); stare++ )
for ( int i = 1; i <= n; i++ )
dp[stare][i] = 1e9;
if ( n0 == 0 ) {
for ( int i = 1; i <= n; i++ )
dp[1 << (i - 1)][i] = dist ( v0[0], v[i] );
}
for ( int i = 1; i <= n; i++ ) {
for ( int j = 1; j <= n0; j++ )
dp[1 << (i - 1)][i] = min ( dp[1 << (i - 1)][i], dp0[j] + dist ( v0[j], v[i]) );
}
for ( int stare = 0; stare < (1 << n); stare++ )
for ( int i0 = 1; i0 <= n; i0++ )
if ( ( stare >> (i0 - 1)) & 1 )
for ( int i = 1; i <= n; i++ )
dp[stare + (1 << (i - 1))][i] = min ( dp[stare + (1 << (i - 1))][i], dp[stare][i0] + dist ( v[i], v[i0] ) );
int ans = 1e9;
for ( int i = 1; i <= n; i++ )
ans = min ( ans, dp[(1 << n) - 1][i] );
fout << ans << "\n";
return 0;
}
int main () {
int t, n = 0, n0 = 0;
fin >> t;
while ( t != 2 ) {
if ( t == 0 ) {
n++;
fin >> v[n].x >> v[n].y;
}
if ( t == 1 ) {
solve ( n, n0 );
for ( int i = 1; i <= n; i++ ) {
v0[i] = v[i];
dp0[i] = dp[(1 << n) - 1][i];
}
n0 = n;
n = 0;
}
fin >> t;
}
return 0;
}