Advertisement
ShabbaWings

Untitled

Oct 20th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cmath>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9. int n;
  10. double all = 0;
  11. cin >> n;
  12. if (n != 0) {
  13. vector<double> x, y;
  14. for (int i = 0; i < n; ++i) {
  15. double q, w;
  16. cin >> q >> w;
  17. x.push_back(q);
  18. y.push_back(w);
  19. }
  20. vector<int> visited(n, 0), way, distance;
  21. way.push_back(0);
  22. visited[0] = 1;
  23. int o = 0;
  24. for (int i = 1; i < n; ++i) {
  25. double dist = 1000000000000000000;
  26. int nearest;
  27. for (int j = 0; j < n; ++j) {
  28. if (visited[j] == 0) {
  29. double newDist = sqrt((x[o] - x[j]) * (x[o] - x[j]) +
  30. (y[o] - y[j]) * (y[o] - y[j]));
  31. if (newDist < dist) {
  32. dist = newDist;
  33. nearest = j;
  34. }
  35. }
  36. }
  37. way.push_back(nearest);
  38. distance.push_back(dist);
  39. all += dist;
  40. visited[nearest] = 1;
  41. o = nearest;
  42. }
  43. distance.push_back(sqrt((x[o] - x[0]) * (x[o] - x[0]) +
  44. (y[o] - y[0]) * (y[o] - y[0])));
  45. all += sqrt((x[o] - x[0]) * (x[o] - x[0]) + (y[o] - y[0]) * (y[o] - y[0]));
  46. way.push_back(0);
  47. for (int flag = 0; flag < 35; ++flag) {
  48. for (int i = 0; i < n - 1; ++i) {
  49. for (int j = 0; j < n - 1; ++j) {
  50. double dFirst = sqrt((x[way[i]] - x[way[j]]) * (x[way[i]] - x[way[j]]) +
  51. (y[way[i]] - y[way[j]]) * (y[way[i]] - y[way[j]]));
  52. double dSecond = sqrt((x[way[i + 1]] - x[way[j + 1]]) *
  53. (x[way[i + 1]] - x[way[j + 1]]) +
  54. (y[way[i + 1]] - y[way[j + 1]]) *
  55. (y[way[i + 1]] - y[way[j + 1]]));
  56. if (distance[i] + distance[j] > dFirst + dSecond) {
  57. double newAll = all;
  58. vector<int> newWay = way;
  59. newAll -= distance[i] - distance[j + 1];
  60. newAll += sqrt((x[way[i]] - x[way[j + 1]]) * (x[way[i]] - x[way[j + 1]]) +
  61. (y[way[i]] - y[way[j + 1]]) * (y[way[i]] - y[way[j + 1]]));
  62. newAll += sqrt((x[way[i + 1]] - x[way[j + 2]]) *
  63. (x[way[i + 1]] - x[way[j + 2]]) +
  64. (y[way[i + 1]] - y[way[j + 2]]) *
  65. (y[way[i + 1]] - y[way[j + 2]]));
  66. reverse(&newWay[i + 1], &newWay[j + 1]);
  67. if (newAll < all) {
  68. all = newAll;
  69. way = newWay;
  70. }
  71. }
  72. }
  73. }
  74. }
  75. for (int i = 0; i < n + 1; ++i) {
  76. cout << way[i] + 1 << ' ';
  77. }
  78. }
  79. return 0;
  80. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement