Cod sursa(job #2498097)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 23 noiembrie 2019 14:43:31
Problema Bibel Scor 95
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = (1 << 30);
struct POINT
{
    int x, y;
};
POINT A[18], B[18];
int d[(1 << 18) + 5][18], cost[18][18], ca[18], cb[18] , cmin;
inline int dist(POINT P1, POINT 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;
    na = 0;
    nb = 2;
    while(scanf("%d" , &p) != EOF)
    {
        if(p == 0)
        {
            ++ na;
            scanf("%d%d", &A[na].x , &A[na].y);
            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;
}