Pagini recente » Cod sursa (job #448410) | Cod sursa (job #3291295) | Cod sursa (job #2483836) | Cod sursa (job #1129751) | Cod sursa (job #358483)
Cod sursa(job #358483)
#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;
}