Cod sursa(job #3207321)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 25 februarie 2024 20:53:32
Problema Bibel Scor 85
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#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;
}