Pagini recente » Cod sursa (job #1102899) | Cod sursa (job #1315858) | Cod sursa (job #2989534) | Cod sursa (job #2829676) | Cod sursa (job #3207316)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ( "bibel.in" );
ofstream fout ( "bibel.out" );
const int N = 17;
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 - 1)); stare++ )
for ( int i = 0; i < n; i++ )
dp[stare][i] = 1e9;
if ( n0 == 0 ) {
for ( int i = 0; i < n; i++ )
dp[1 << i][i] = dist ( v0[0], v[i] );
}
for ( int i = 0; i < n; i++ ) {
for ( int j = 0; j < n0; j++ )
dp[1 << i][i] = min ( dp[1 << i][i], dp0[j] + dist ( v0[j], v[i]) );
}
for ( int stare = 0; stare < (1 << (n - 1)); stare++ )
for ( int i0 = 0; i0 < n; i0++ )
if ( ( stare >> i0 ) & 1 )
for ( int i = 0; i < n; i++ )
dp[stare + (1 << i)][i] = min ( dp[stare + (1 << i)][i], dp[stare][i0] + dist ( v[i], v[i0] ) );
int ans = 1e9;
for ( int i = 0; i < n; i++ )
ans = min ( ans, dp[(1 << (n - 1)) - 1][i] );
fout << ans << "\n";
return 0;
}
int main () {
int t, n = 0, n0 = 0;
fin >> t;
while ( t != 2 ) {
if ( t == 0 ) {
fin >> v[n].x >> v[n].y;
n++;
}
if ( t == 1 ) {
solve ( n, n0 );
for ( int i = 0; i < n; i++ ) {
v0[i] = v[i];
dp0[i] = dp[(1 << (n - 1)) - 1][i];
}
n0 = n;
n = 0;
}
fin >> t;
}
return 0;
}