Pagini recente » Cod sursa (job #316359) | Cod sursa (job #2937225) | Cod sursa (job #1671265) | Cod sursa (job #1945195) | Cod sursa (job #1744270)
#include <fstream>
#include <algorithm>
#include <vector>
#include <limits>
using namespace std;
ifstream cin("bibel.in");
ofstream cout("bibel.out");
const int MAXN = 17;
const int INF = numeric_limits<int>::max();
int level = 1, n = 0;
int x[MAXN], y[MAXN], x0[MAXN], yMori[MAXN], previous;
int dp[1 << MAXN][MAXN];
int Distance(int x1, int y1, int x2, int y2) {
return (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
}
int Solve() {
if (level == 1)
previous = n;
for (int i = 1; i < (1 << n); i++)
for (int j = 0; j < n; j++)
dp[i][j] = INF;
for (int j = 0; j < previous; j++)
for (int i = 0; i < n; i++)
dp[1 << i][i] = min(dp[1 << i][i], dp[0][j] + Distance(x[i], y[i], x0[j], yMori[j]));
for (int i = 1; i < (1 << n); i++)
for (int j = 0; j < n; j++)
if (i & (1 << j))
for (int k = 0; k < n; k++)
if (i & (1 << k) && k != j)
dp[i][j] = min(dp[i][j], dp[i ^ (1 << j)][k] + Distance(x[k], y[k], x[j], y[j]));
int answer = INF;
for (int i = 0; i < n; i++) {
answer = min(answer, dp[(1 << n) - 1][i]);
x0[i] = x[i];
yMori[i] = y[i];
dp[0][i] = dp[(1 << n) - 1][i];
}
previous = n;
return answer;
}
int main() {
while (1) {
int type;
cin >> type;
if (type == 0) {
cin >> x[n] >> y[n];
n++;
}
if (type == 1) {
cout << Solve() << "\n";
n = 0;
level++;
}
if (type == 2)
return 0;
}
return 0;
}