Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <set>
- #include <random>
- #include <algorithm>
- #include <cmath>
- #include <ctime>
- using namespace std;
- int main() {
- size_t n;
- cin >> n;
- clock_t time = clock();
- set<int> not_visit;
- vector<int> res;
- vector<vector<float>> map(n, vector<float>(n));
- vector<pair<float, float>> cities;
- cities.resize(n);
- int nt = 0;
- int c = 0;
- int cv = 0;
- float currl = 0.0;
- for(int i = 0; i != n; ++i) {
- cin >> cities[i].first >> cities[i].second;
- not_visit.insert(i);
- }
- for(int i = 0; i < n; ++i) {
- for (int j = i + 1; j < n ; ++j) {
- float d = sqrt(pow(cities[i].first - cities[j].first, 2) +
- pow(cities[i].second - cities[j].second, 2));
- map[i][j] = d;
- map[j][i] = d;
- }
- }
- while(!not_visit.empty()) {
- not_visit.erase(cv);
- res.push_back(cv);
- c = 0;
- for (const auto elem : not_visit) {
- if ((c != 0) && (map[elem][cv] < currl)) {
- currl = map[elem][cv];
- nt = elem;
- } else if (c == 0) {
- currl = map[elem][cv];
- nt = elem;
- }
- c += 1;
- }
- cv = nt;
- }
- res.push_back(0);
- while (((clock() - time)/(float)CLOCKS_PER_SEC) <= 9.99) {
- random_device randd;
- uniform_int_distribution<int> id(1, n - 2);
- mt19937 mt19_(randd());
- int i = id(mt19_);
- uniform_int_distribution<int> id_sec(i + 1, n + 1 - 2);
- int j = id_sec(mt19_);
- float new_ = map[res[j]][res[i - 1]] + map[res[i]][res[j + 1]];
- float c = map[res[j]][res[j + 1]] + map[res[i]][res[i - 1]];
- if(new_ < c) {
- reverse(res.begin() + i, res.begin() + j + 1);
- }
- }
- for (size_t i = 0; i != res.size(); ++i) {
- cout << res[i] + 1 << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement