Cod sursa(job #2498086)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 23 noiembrie 2019 14:34:07
Problema Bibel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 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]);
                    }
    for(i = 1 ; i < n ; ++ i)
    {
        ca[i] = min(ca[i], d[lim][i]);
        cmin = min(cmin , ca[i]);
        B[i] = A[i];
        cb[i] = ca[i];
    }
    printf("%d\n" , cmin);
}
int main()
{
    freopen("bibel.in", "r", stdin);
    freopen("bibel.out", "w", stdout);
    int na, nb, i, j ,  p, tx, ty , aux;
    na = 0;
    nb = 2;
    while(scanf("%d", &p) != EOF)
    {
        if(p == 0)
        {
            scanf("%d%d", &tx, &ty);
            ++ na;
            A[na].x = tx;
            A[na].y = ty;
        }
        else if(p == 1)
        {
            ++ na;
            for(i = 1 ; i < na ; ++ i)
                ca[i] = cost[i][0] = cost[0][i] = INF;
            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);
            cmin = INF;
            memcpy(cb, ca, sizeof(ca));
            nb = na;
            na = 0;
        }
        else
            break;
    }
    return 0;
}