Cod sursa(job #648041)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 12 decembrie 2011 22:37:46
Problema Bibel Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;

int a[1 << 17][17], sol, ttt, P = 1, Q, NV;
struct punct {int x, y;} v[20][2], ZERO;

inline int dist(punct a, punct b)
{
    int var = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
    return var;
}
int main()
{
    ifstream f("bibel.in");
    ofstream g("bibel.out");

    for (; ; ++ttt)
    {
        int x = 0, N = 0;
        for (; ; )
        {
            f >> x;
            if (x == 0)
            {
                f >> v[N][P].x >> v[N][P].y;
                ++N;
            }
            else break ;
        }
        if (x == 2) break ;

        // Q e anteriorul
        if (ttt)
        {
            for (int i = 0; i < N; ++i) a[1 << i][i] = 2000000000;
            for (int j = 0; j < NV; ++j)
                for (int i = 0; i < N; ++i) a[1 << i][i] = min(a[1 << i][i], a[(1 << NV) - 1][j] + dist(v[j][Q], v[i][P]));

            for (int i = 1; i < (1 << N); ++i)
                for (int j = 0; j < N; ++j)
                    if (i & (i - 1))
                        a[i][j] = 2000000000;
        }
        else
        {
            for (int i = 1; i < (1 << N); ++i)
                for (int j = 0; j < N; ++j)
                    a[i][j] = 2000000000;
            for (int i = 0; i < N; ++i) a[1 << i][i] = dist(ZERO, v[i][P]);
        }

        for (int i = 0; i < (1 << N); ++i)
            for (int j = 0; j < N; ++j) // extinzi pe a[i][j]
                if (i & (1 << j))
                    for (int k = 0; k < N; ++k) // cu ultimul in k
                        if (!(i & (1 << k)))
                            a[i | (1 << k)][k] = min(a[i | (1 << k)][k], a[i][j] + dist(v[j][P], v[k][P]));

        /*for (int i = 0; i < (1 << N); ++i, cout << '\n')
            for (int j = 0; j < N; ++j)
                cout << a[i][j] << ' ';*/

        sol = 2000000000;
        for (int i = 0; i < N; ++i)
            if (sol > a[(1 << N) - 1][i] && a[(1 << N) - 1][i])
                sol = a[(1 << N) - 1][i];

        g << sol << '\n';
        NV = N;
        P ^= Q ^= P ^= Q;
    }
    g.close();
    return 0;
}