Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.74 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. long double dist(pair<long long, long long> a, pair<long long, long long> b) {
  8. long double len = sqrt(((b.first - a.first) * (b.first - a.first)) + ((b.second - a.second) * (b.second - a.second)));
  9. return len;
  10. }
  11.  
  12. bool optim(vector<long long>& ans, vector<pair<long long, long long>> & g) {
  13. bool ok = false;
  14.  
  15. for (auto it1 = ans.begin(); (it1 + 3) != ans.end(); ++it1) {
  16. int v0 = *it1, v1 = *(it1 + 1);
  17. for (auto it2 = it1 + 2; it2 + 1 != ans.end(); ++it2) {
  18. int v2 = *it2, v3 = *(it2 + 1);
  19. if (dist(g[v0], g[v2]) + dist(g[v1], g[v3]) < dist(g[v0], g[v1]) + dist(g[v2], g[v3])) {
  20. ok = true;
  21. reverse(it1 + 1, it2 + 1);
  22. --it1;
  23. break;
  24. }
  25. }
  26. }
  27.  
  28. if (ok)
  29. return ok;
  30.  
  31. for (int i = 1; i + 1 < ans.size(); i++) {
  32. int u = ans[i];
  33. for (int j = 1; j + 1 < ans.size(); j++) {
  34. if (i == j || i == j - 1)
  35. continue;
  36.  
  37. if (dist(g[ans[i - 1]], g[ans[i + 1]]) +
  38. dist(g[ans[j]], g[ans[i]]) + dist(g[ans[i]], g[ans[j - 1]]) < dist(g[ans[i]], g[ans[i - 1]])
  39. + dist(g[ans[i]], g[ans[i + 1]]) + dist(g[ans[j]], g[ans[j - 1]])) {
  40. if (i > j) {
  41. ans.erase(ans.begin() + i);
  42. ans.insert(ans.begin() + j, u);
  43. }
  44. else {
  45. ans.insert(ans.begin() + j, u);
  46. ans.erase(ans.begin() + i);
  47. }
  48. return true;
  49. }
  50. }
  51. }
  52. return false;
  53. }
  54.  
  55.  
  56. int main() {
  57. long long n;
  58. cin >> n;
  59. vector<pair<long long, long long>> data(n);
  60. for (size_t i = 0; i != n; ++i) {
  61. long long x, y;
  62. cin >> x >> y;
  63. data[i] = { x, y };
  64. }
  65. vector<bool> used(n, false);
  66. vector<long long> ans;
  67. ans.push_back(0);
  68. used[0] = true;
  69. for (size_t i = 0; i != n; ++i) {
  70. long long start = ans[i];
  71. long long min = 0;
  72. long double len = 1e18;
  73. for (size_t j = 0; j != n; ++j) {
  74. if (start != j && !used[j]) {
  75. if (dist(data[start], data[j]) < len) {
  76. len = dist(data[start], data[j]);
  77. min = j;
  78. }
  79. }
  80. }
  81. used[min] = true;
  82. ans.push_back(min);
  83. }
  84. if (n < 1000) {
  85. while (optim(ans, data)) {}
  86. }
  87. else {
  88. for (int i = 0; i < 20; i++) {
  89. optim(ans, data);
  90. }
  91. }
  92. for (auto x : ans) {
  93. cout << x + 1 << " ";
  94. }
  95. system("pause");
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement