Advertisement
Dzham

Untitled

Oct 8th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.26 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5. #include <math.h>
  6. #include <float.h>
  7.  
  8. double dist(const std::pair<int64_t, int64_t>& p1, const std::pair<int64_t, int64_t>& p2) {
  9. return std::sqrt((p1.first - p2.first) * (p1.first - p2.first) + (p1.second - p2.second) * (p1.second - p2.second));
  10. }
  11.  
  12. int skip(int i, int N) {
  13. if ((i + 1) == N) {
  14. return 0;
  15. } else {
  16. return i + 1;
  17. }
  18. }
  19.  
  20. int bskip(int i, int N) {
  21. if ((i - 1) == -1) {
  22. return N - 1;
  23. } else {
  24. return i - 1;
  25. }
  26. }
  27.  
  28. void swap_pairs(int N, std::vector<int>& path, const std::vector<std::vector<double>>& len) {
  29. int begin = 0, end = 1, prev = N - 1, next = 2, count = 0;
  30. while (true) {
  31. double old_len = len[path[prev]][path[begin]] + len[path[begin]][path[end]] + len[path[end]][path[next]];
  32. double new_len = len[path[prev]][path[end]] + len[path[begin]][path[end]] + len[path[begin]][path[next]];
  33. if (old_len > new_len) {
  34. count += 1;
  35. std::swap(path[begin], path[end]);
  36. }
  37. prev = begin;
  38. begin = end;
  39. end = next;
  40. next++;
  41. if (next == N) {
  42. next = 0;
  43. }
  44. if (begin == 0) {
  45. if (count == 0) {
  46. break;
  47. }
  48. count = 0;
  49. }
  50. }
  51. }
  52.  
  53. void swap_two(int N, std::vector<int>& path, const std::vector<std::vector<double>>& len) {
  54. for (int i = 0; i < N; ++i) {
  55. int begin1 = i;
  56. int begin2 = skip(skip(i, N), N);
  57. int count = 0;
  58. while (true) {
  59. if (skip(begin2, N) == begin1) {
  60. if (count == 0) {
  61. break;Плейлисты
  62. }
  63. begin2 = skip(skip(i, N), N);
  64. count = 0;
  65. } else {
  66. if (skip(skip(begin1, N), N) == begin2) {
  67. double old_len = len[path[begin1]][path[skip(begin1, N)]] + len[path[begin2]][path[skip(begin2, N)]];
  68. double new_len = len[path[begin1]][path[begin2]] + len[path[skip(begin1, N)]][path[skip(begin2, N)]];
  69. if (old_len > new_len) {
  70. count += 1;
  71. std::swap(path[begin2], path[skip(begin1, N)]);
  72. }
  73. begin2 = skip(begin2, N);
  74. } else {
  75. double old_len = len[path[begin1]][path[skip(begin1, N)]] + len[path[begin2]][path[skip(begin2, N)]] +
  76. len[path[skip(begin1, N)]][path[skip(skip(begin1, N), N)]] + len[path[begin2]][path[bskip(begin2, N)]];
  77. double new_len = len[path[begin1]][path[begin2]] + len[path[skip(begin1, N)]][path[skip(begin2, N)]] +
  78. len[path[begin2]][path[skip(skip(begin1, N), N)]] + len[path[skip(begin1, N)]][path[bskip(begin2, N)]];
  79. if (old_len > new_len) {
  80. count += 1;
  81. std::swap(path[begin2], path[skip(begin1, N)]);
  82. }
  83. begin2 = skip(begin2, N);
  84. }
  85. }
  86. }
  87. }
  88. }
  89.  
  90. void permutation(int N, std::vector<int>& path, const std::vector<std::vector<double>>& len) {
  91.  
  92. }
  93.  
  94. void print_correct(const std::vector<int>& path) {
  95. int first;
  96. for (int i = 0; i < path.size(); ++i) {
  97. if (path[i] == 0) {
  98. first = i;
  99. break;
  100. }
  101. }
  102. for (int i = first; i < path.size(); ++i) {
  103. std::cout << path[i] + 1 << ' ';
  104. }
  105. for (int i = 0; i < first; ++i) {
  106. std::cout << path[i] + 1 << ' ';
  107. }
  108. std::cout << path[first] + 1 << '\n';
  109. }
  110.  
  111. int main() {
  112. int N, a, b;
  113. std::cin >> N;
  114. std::vector<std::pair<int64_t, int64_t>> points(N);
  115. for (int i = 0; i < N; ++i) {
  116. std::cin >> a >> b;
  117. points[i] = std::make_pair(a, b);
  118. }
  119. std::vector<std::vector<double>> len(N);
  120. for (auto& i : len) {
  121. i.resize(N);
  122. }
  123. for (int i = 0; i < N; ++i) {
  124. for (int j = i + 1; j < N; ++j) {
  125. double d = dist(points[i], points[j]);
  126. len[i][j] = d;
  127. len[j][i] = d;
  128. }
  129. }
  130. std::set<int> used;
  131. std::vector<int> path(N);
  132. path[0] = 0;
  133. used.insert(0);
  134. int64_t dist_result = 0;
  135. for (int i = 0; i < N - 1; ++i) {
  136. int best = i + 1;
  137. double best_dist = DBL_MAX;
  138. for (int j = 0; j < N; ++j) {
  139. if (path[i] != j) {
  140. if (used.find(j) == used.end()) {
  141. double dist_temp = len[path[i]][j];
  142. if (dist_temp < best_dist) {
  143. best = j;
  144. best_dist = dist_temp;
  145. }
  146. }
  147. }
  148. }
  149. used.insert(best);
  150. path[i + 1] = best;
  151. dist_result += best_dist;
  152. }
  153. dist_result += len[0][N - 1];
  154. // for (auto i : path) {
  155. // std::cout << i + 1 << ' ';
  156. // }
  157. // std::cout << path[0] + 1 << '\n';
  158. swap_pairs(N, path, len);
  159. swap_two(N, path, len);
  160. // for (auto i : path) {
  161. // std::cout << i + 1 << ' ';
  162. // }
  163. // std::cout << path[0] + 1 << '\n';
  164. print_correct(path);
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement