Cod sursa(job #2498104)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 23 noiembrie 2019 14:54:11
Problema Bibel Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
#define x first
#define y second
using namespace std;
const int INF = (1 << 30);
pair <int , int> A[18], B[18];
int d[(1 << 18) + 5][18], cost[18][18], ca[18], cb[18] , cmin;
inline int dist(pair <int , int> P1, pair <int , int> P2)
{
    return (P1.x - P2.x) * (P1.x - P2.x) + (P1.y - P2.y) * (P1.y - P2.y);
}
inline void dinamica(int n)
{
    int i, j, k, bitmask, new_bitmask, lim, cmin;
    for(i = 1 ; i < n ; ++ i)
        for(j = 1 ; j < n ; ++ j)
            cost[i][j] = dist(A[i], A[j]);
    lim = (1 << n) - 1;
    for(i = 0 ; i <= lim ; ++ i)
        for(j = 0 ; j < n ; ++ j)
            d[i][j] = INF;
    d[1][0] = 0;
    for(bitmask = 0 ; bitmask <= lim ; ++ bitmask)
        for(i = 0 ; i < n ; ++ i)
            if(bitmask & (1 << i))
                for(j = 0 ; j < n ; ++ j)
                    if(!(bitmask & (1 << j)))
                    {
                        new_bitmask = (bitmask | (1 << j));
                        d[new_bitmask][j] = min(d[new_bitmask][j], d[bitmask][i] + cost[i][j]);
                    }
    cmin = INF;
    for(i = 1 ; i < n ; ++ i)
    {
        cb[i] = d[lim][i];
        cmin = min(cmin , cb[i]);
        B[i] = A[i];
    }
    printf("%d\n" , cmin);
}
int main()
{
    freopen("bibel.in", "r", stdin);
    freopen("bibel.out", "w", stdout);
    int na , nb , i , j , p , aux , tx , ty;
    na = 0;
    nb = 2;
    while(scanf("%d" , &p) != EOF)
    {
        if(p == 0)
        {
            ++ na;
            scanf("%d%d", &tx , &ty);
            A[na].x = tx;
            A[na].y = ty;
            cost[na][0] = cost[0][na] = INF;
        }
        else if(p == 1)
        {
            ++ na;
            for(i = 1 ; i < na ; ++ i)
                for(j = 1 ; j < nb ; ++ j)
                {
                    aux = cb[j] + dist(A[i] , B[j]);
                    cost[i][0] = min(cost[i][0] , aux);
                    cost[0][i] = min(cost[0][i] , aux);
                }
            dinamica(na);
            nb = na;
            na = 0;
        }
        else
            break;
    }
    return 0;
}