Cod sursa(job #355123)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 10 octombrie 2009 11:12:50
Problema Bibel Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;

#define FIN "bibel.in"
#define FOUT "bibel.out"

#define N 18
#define MAXST 131072
#define oo 1000000000

int d1[N], d2[N][MAXST], P[N];

pair <int, int> v1[N], v2[N];

inline int dist(pair <int, int> a, pair <int, int> b)
{
    return ((b.first - a.first) * (b.first - a.first) + (b.second - a.second) * (b.second - a.second));
}

void solve()
{
    int i, st, k;

    for (i = 0; i <= 17; ++ i)
    {
		d1[i] = d2[i][P[v1[0].first] - 1];
        //memcpy(d1[i], d2[i], sizeof(d2[i]));

        for (k = 0; k < P[17]; ++ k)
            d2[i][k] = oo;
    }

    for (i = 0; i < v2[0].first; ++ i)
        for (k = 0; k < v1[0].first; ++ k)
            d2[i][P[i]] = min(d2[i][P[i]], d1[k] + dist(v2[i + 1], v1[k + 1]));

    for (st = 0; st < P[v2[0].first]; ++ st)
        for (i = 0; i < v2[0].first; ++ i)
            if (st & P[i])
                for (k = 0; k < v2[0].first; ++ k)
                    if (st & P[k])
                        d2[i][st] = min(d2[i][st], d2[k][st - P[i]] + dist(v2[i + 1], v2[k + 1]));

}

int main()
{
    int i, t = 0, r;

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

    v1[1] = make_pair(0, 0);
	v1[0].first = 1;

	for (i = 0; i < 18; ++ i)
		P[i] = 1 << i;
		
    while (t != 2)
    {
        scanf("%d", &t);

        if (!t) {
			++ v2[0].first;
            scanf("%d%d", &v2[v2[0].first].first, &v2[v2[0].first].second);
		}
        if (t == 1)
        {
            solve();

            for (i = 0, r = oo; i < v2[0].first; ++ i)
                r = min(r, d2[i][P[v2[0].first] - 1]);

            printf("%d\n", r);

            memcpy(v1, v2, sizeof(v2));

            v2[0].first = 0;
        }
    }
	
}