Cod sursa(job #2498671)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 24 noiembrie 2019 10:38:02
Problema Bibel Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 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;
char s[55];
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] = (A[i].x - A[j].x) * (A[i].x - A[j].x) + (A[i].y - A[j].y) * (A[i].y - A[j].y);
    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, nr, ok , aux , m;
    na = 0;
    nb = 2;
    while(gets(s))
    {
        if(s[0] == '2')
            break;
        if(s[0] == '0')
        {
            ++ na;
            m = strlen(s);
            nr = ok = 0;
            for(i = 1 ; i < m ; ++ i)
            {
                if(s[i] != ' ')
                    nr = nr * 10 + s[i] - '0';
                if((i > 1 && s[i] == ' ' && s[i - 1] != ' ') || (i == m - 1 && s[i] != ' '))
                {
                    if(ok == 0)
                        A[na].x = nr;
                    else
                        A[na].y = nr;
                    ok = 1;
                    nr = 0;
                }
            }
            continue;
        }
        if(s[0] == '1')
        {
            ++ na;
            for(i = 1 ; i < na ; ++ i)
                cost[i][0] = cost[0][i] = INF;
            for(i = 1 ; i < na ; ++ i)
                for(j = 1 ; j < nb ; ++ j)
                {
                    aux = cb[j] + (A[i].x - B[j].x) * (A[i].x - B[j].x) + (A[i].y - B[j].y) * (A[i].y - B[j].y);
                    cost[i][0] = min(cost[i][0] , aux);
                    cost[0][i] = min(cost[0][i] , aux);
                }
            dinamica(na);
            nb = na;
            na = 0;
        }
    }
    return 0;
}