Pagini recente » Cod sursa (job #754869) | Cod sursa (job #2897469) | Cod sursa (job #756419) | Cod sursa (job #1815409) | Cod sursa (job #1610387)
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
#include <functional>
#include <string>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <bitset>
#include <stack>
#include <iomanip>
#define MOD 1000000007
#define NMAX 17
#define INF 0x3f3f3f3f
using namespace std;
FILE *fin = freopen("bibel.in", "r", stdin);
FILE *fout = freopen("bibel.out", "w", stdout);
typedef pair<int, int> pii;
int Cost[NMAX][NMAX], A[NMAX][2], B[1 << NMAX][NMAX], Min[NMAX], last[NMAX][3];
inline int calcDist(int x1, int x2, int y1, int y2) {
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int main() {
int n = 0, q, x, y, i, j, nr = 1, k, res;
while (1) {
scanf("%d", &q);
if (q == 0) {
scanf("%d%d", &A[n][0], &A[n][1]);
++n;
}
else if (q == 1) {
res = INF;
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
Cost[i][j] = Cost[j][i] = calcDist(A[i][0], A[j][0], A[i][1], A[j][1]);
for (i = 0; i < (1 << NMAX); ++i)
for (j = 0; j < NMAX; ++j)
B[i][j] = INF;
for (i = 0; i < n; ++i)
for (j = 0; j < nr; ++j)
B[1 << i][i] = min(B[1 << i][i], Min[j] + calcDist(last[j][0], A[i][0], last[j][1], A[i][1]));
for (i = 1; i < (1 << n); ++i)
for (j = 0; j < n; ++j)
if (i & (1 << j))
for (k = 0; k < n; ++k)
if (i & (1 << k))
B[i][j] = min(B[i][j], B[i ^ (1 << j)][k] + Cost[k][j]);
int aux = INF;
for (i = 0; i < n; ++i)
aux = min(aux, B[(1 << n) - 1][i]);
if (aux < res)
res = aux;
for (i = 0; i < n; ++i)
Min[i] = B[(1 << n) - 1][i];
memset(Cost, INF, sizeof(Cost));
nr = n;
for (i = 0; i < nr; ++i)
last[i][0] = A[i][0], last[i][1] = A[i][1];
n = 0;
printf("%d\n", res);
}
else
break;
}
return 0;
}