Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <cmath>
- using namespace std;
- long double dist(pair<long long, long long> a, pair<long long, long long> b) {
- long double len = sqrt(((b.first - a.first) * (b.first - a.first)) + ((b.second - a.second) * (b.second - a.second)));
- return len;
- }
- bool optim(vector<long long>& ans, vector<pair<long long, long long>> & g) {
- bool ok = false;
- for (auto it1 = ans.begin(); (it1 + 3) != ans.end(); ++it1) {
- int v0 = *it1, v1 = *(it1 + 1);
- for (auto it2 = it1 + 2; it2 + 1 != ans.end(); ++it2) {
- int v2 = *it2, v3 = *(it2 + 1);
- if (dist(g[v0], g[v2]) + dist(g[v1], g[v3]) < dist(g[v0], g[v1]) + dist(g[v2], g[v3])) {
- ok = true;
- reverse(it1 + 1, it2 + 1);
- --it1;
- break;
- }
- }
- }
- if (ok)
- return ok;
- for (int i = 1; i + 1 < ans.size(); i++) {
- int u = ans[i];
- for (int j = 1; j + 1 < ans.size(); j++) {
- if (i == j || i == j - 1)
- continue;
- if (dist(g[ans[i - 1]], g[ans[i + 1]]) +
- dist(g[ans[j]], g[ans[i]]) + dist(g[ans[i]], g[ans[j - 1]]) < dist(g[ans[i]], g[ans[i - 1]])
- + dist(g[ans[i]], g[ans[i + 1]]) + dist(g[ans[j]], g[ans[j - 1]])) {
- if (i > j) {
- ans.erase(ans.begin() + i);
- ans.insert(ans.begin() + j, u);
- }
- else {
- ans.insert(ans.begin() + j, u);
- ans.erase(ans.begin() + i);
- }
- return true;
- }
- }
- }
- return false;
- }
- int main() {
- long long n;
- cin >> n;
- vector<pair<long long, long long>> data(n);
- for (size_t i = 0; i != n; ++i) {
- long long x, y;
- cin >> x >> y;
- data[i] = { x, y };
- }
- vector<bool> used(n, false);
- vector<long long> ans;
- ans.push_back(0);
- used[0] = true;
- for (size_t i = 0; i != n; ++i) {
- long long start = ans[i];
- long long min = 0;
- long double len = 1e18;
- for (size_t j = 0; j != n; ++j) {
- if (start != j && !used[j]) {
- if (dist(data[start], data[j]) < len) {
- len = dist(data[start], data[j]);
- min = j;
- }
- }
- }
- used[min] = true;
- ans.push_back(min);
- }
- if (n < 1000) {
- while (optim(ans, data)) {}
- }
- else {
- for (int i = 0; i < 20; i++) {
- optim(ans, data);
- }
- }
- for (auto x : ans) {
- cout << x + 1 << " ";
- }
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement