Cod sursa(job #117939)

Utilizator dominoMircea Pasoi domino Data 22 decembrie 2007 19:46:36
Problema Bibel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

#define MAX_LEV 205
#define MAX_P 17
#define FIN "bibel.in"
#define FOUT "bibel.out"
#define mp make_pair
#define pb push_back
#define x first
#define y second
#define sqr(x) ((x)*(x))
#define dist(a, b) sqr(a.x-b.x)+sqr(a.y-b.y)
#define INF 0x3f3f3f3f

typedef pair<int, int> point;

int D[MAX_P][MAX_P], A[MAX_P][1<<MAX_P], bst[MAX_LEV][MAX_P], Res;
vector<point> P[MAX_LEV];

int main(void)
{
    int op, x, y, i, j, k, p, n, lv = 0;

    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    P[0].pb(mp(0, 0));
    for (lv = 1; scanf("%d %d %d", &op, &x, &y) == 3; ++lv)
    {
        P[lv].pb(mp(x, y));
        while (scanf("%d", &op) == 1 && !op)
        {
            scanf("%d %d", &x, &y);
            P[lv].pb(mp(x, y));
        }

        n = P[lv].size();
        for (i = 0; i < n; ++i)
            for (j = 0; j < n; ++j)
                D[i][j] = dist(P[lv][i], P[lv][j]);

        memset(bst[lv], 0x3f, sizeof(bst[0]));
        for (i = 0; i < n; ++i)
        {
            for (j = 1; j < (1<<n); ++j)
                for (k = 0; k < n; ++k) A[j][k] = INF;
            A[1<<i][i] = 0;
            for (j = 1; j < (1<<n); ++j)
                for (k = 0; k < n; ++k)
                {
                    if (A[j][k] == INF) continue;
                    for (p = 0; p < n; ++p)
                    {
                        if (j&(1<<p)) continue;
                        A[j|(1<<p)][p] = min(A[j|(1<<p)][p], A[j][k]+D[k][p]);
                    }
                }

            for (j = 0; j < n; ++j)
                for (k = 0; k < P[lv-1].size(); ++k)
                    bst[lv][j] = min(bst[lv][j], bst[lv-1][k]+dist(P[lv-1][k], P[lv][i])+A[(1<<n)-1][j]);
        }

        Res = INF;
        for (i = 0; i < n; ++i)
            Res = min(Res, bst[lv][i]);
        printf("%d\n", Res);
    }

    return 0;
}