Cod sursa(job #2497680)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 23 noiembrie 2019 10:07:39
Problema Bibel Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const long long INF = 2.e9;
struct POINT
{
    long long x, y;
};
POINT A[18], B[18];
long long d[(1 << 11) + 5][18], cost[18][18], ca[18], cb[18];
long long dist(POINT P1, POINT P2)
{
    return (P1.x - P2.x) * (P1.x - P2.x) + (P1.y - P2.y) * (P1.y - P2.y);
}
void dinamica(long long n)
{
    long long 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]);
}
int main()
{
    freopen("bibel.in", "r", stdin);
    freopen("bibel.out", "w", stdout);
    long long na, nb, i, j ,  p, tx, ty, cmin , ok;
    na = 0;
    nb = 2;
    while(scanf("%lld", &p) != EOF)
    {
        if(p == 1)
            ok = 1;
        if(p == 0)
        {
            scanf("%lld%lld", &tx, &ty);
            na ++;
            A[na].x = tx;
            A[na].y = ty;
            if(na == 9)
            {
                p = 1;
                ok = 0;
            }
        }
        if(p == 1)
        {
            if(na > 0)
            {
                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 ++)
                    {
                        cost[i][0] = min(cost[i][0] , cb[j] + dist(A[i] , B[j]));
                        cost[0][i] = min(cost[0][i] , cb[j] + dist(A[i] , B[j]));
                    }
                dinamica(na);
                memcpy(cb, ca, sizeof(ca));
                cmin = INF;
                for(i = 1 ; i < na ; i ++)
                {
                    B[i] = A[i];
                    cmin = min(cmin, ca[i]);
                }
                nb = na;
            }
            if(ok == 1)
                printf("%lld\n", cmin);
            na = 0;
        }
        if(p == 2)
            break;
    }
    return 0;
}