Pagini recente » Cod sursa (job #3272283) | Cod sursa (job #2981030) | Cod sursa (job #2191815) | Cod sursa (job #3292494) | Cod sursa (job #2976818)
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int best[17][1 << 17];
inline int sqr(int a) { return a * a; }
void solve(vector<pair<int,int> > &v, vector<int> &res) {
int n = v.size();
for (int i = 1; i < (1 << n); ++i) {
for (int k = 0; k < n; ++k) {
if (((1 << k) & i) == 0) {
continue;
}
for (int j = 0; j < n; ++j) {
if ((1 << j) & i) {
best[j][i] = min(best[j][i], best[k][i - (1<<j)] + sqr(v[k].first - v[j].first) + sqr(v[k].second - v[j].second));
}
}
}
}
for (int k = 0; k < n; ++k) {
res[k] = min(res[k], best[k][(1 << n) - 1]);
}
}
int main() {
freopen("bibel.in", "r", stdin);
freopen("bibel.out", "w", stdout);
int op;
vector<pair<int,int> > level;
vector<pair<int,int> > prevLevel;
vector<int> prevRes(1);
prevLevel.push_back(make_pair(0, 0));
while (true) {
cin >> op;
if (op == 2) {
return 0;
}
if (op == 1) {
vector<int> res(level.size(), 2000000000);
int n = level.size();
for (int k = 0; k < n; ++k) {
for (int i = 0; i < (1<<n); ++i) {
best[k][i] = 2000000000;
}
}
for (int i = 0; i < prevLevel.size(); ++i) {
int startDist = prevRes[i];
pair<int, int> start = prevLevel[i];
for (int k = 0; k < n; ++k) {
best[k][1 << k] = min(best[k][1 << k], startDist + sqr(level[k].first - start.first) + sqr(level[k].second - start.second));
}
}
solve(level, res);
prevRes = res;
prevLevel = level;
level.clear();
int best = res[0];
for (auto it : res) {
best = min(best, it);
}
cout << best << "\n";
continue;
}
int x, y;
cin >> x >> y;
level.push_back(make_pair(x, y));
}
return 0;
}