Cod sursa(job #2119593)

Utilizator liviu2000Dragomirescu Liviu liviu2000 Data 1 februarie 2018 14:23:45
Problema Bibel Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#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() ;
    }
}