Pagini recente » Cod sursa (job #1035738) | Cod sursa (job #2184811) | Cod sursa (job #2630186) | Cod sursa (job #1855509) | Cod sursa (job #2976809)
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
inline int sqr(int a) { return a * a; }
void solve(vector<pair<int,int> > &v, pair<int, int> start, int startDist, vector<int> &res) {
int n = v.size();
int best[n][1 << n];
for (int k = 0; k < n; ++k) {
for (int i = 0; i < (1<<n); ++i) {
best[k][i] = 1000000000;
}
}
for (int k = 0; k < n; ++k) {
best[k][1 << k] = startDist + sqr(v[k].first - start.first) + sqr(v[k].second - start.second);
}
for (int i = 1; i < 1 << n; ++i) {
for (int k = 0; k < n; ++k) {
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] = 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);
for (int i = 0; i < prevLevel.size(); ++i) {
solve(level, prevLevel[i], prevRes[i], 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;
}