Cod sursa(job #358483)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 23 octombrie 2009 13:00:37
Problema Bibel Scor 95
Compilator c Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <stdio.h>
#define oo  2100000000

typedef struct point point;
struct point {
    int x, y;
} A[30], B[30];
int N, C[(1 << 17)][18], p[20], M, D[20];
inline int min (int a, int b) {
    return (a > b) ? b : a;
}

inline int dist (point a, point b) {
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}

void solve (int Nivel) {
    int i, j, prev, k, Sol;

    for (i = 0; i < p[N]; ++ i)
        for (j = 0; j < N; ++ j)
            C[i][j] = oo;
    if (Nivel == 1) {
        for (i = 0; i < N; ++ i)
            C[p[i]][i] = dist((point) {0, 0}, A[i]);
    } else {
        for (i = 0; i < N; ++ i)
            for (j = 0; j < M; ++ j)
                C[p[i]][i] = min(C[p[i]][i], D[j] + dist(B[j], A[i]));
    }

    for (i = 1; i < p[N]; ++ i)
        for (j = 0; j < N; ++ j)
            if (i & p[j]) {
                prev = i - p[j];
                for (k = 0; k < N; ++ k)
                    if (prev & p[k])
                        C[i][j] = min(C[i][j], C[prev][k] + dist(A[k], A[j]));
            }

    for (j = 0, Sol = oo; j < N; ++ j) {
        D[j] = C[p[N] - 1][j];
        Sol = min(Sol, C[p[N] - 1][j]);
    }

    M = N;
    for (i = 0; i < M; ++ i)
        B[i] = A[i];
    N = 0;

    printf("%d\n", Sol);
}

int main () {
    int i, c, Nrnivel = 0;

    freopen("bibel.in", "r", stdin);
    freopen("bibel.out", "w", stdout);

    for (i = 0; i < 18; ++ i)   p[i] = 1 << i;

    while(scanf("%d", &c) && c != 2) {
        if (c == 2)     return 0;
        if (c == 0)
            scanf("%d%d", &A[N].x, &A[N].y), N ++;
        else if (c == 1)
            solve(++ Nrnivel);
    }

    return 0;
}