Advertisement
Guest User

Untitled

a guest
May 29th, 2015
243
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <math.h>
  4. using namespace std;
  5.  
  6. #define dot pair<int, int>
  7.  
  8.  
  9. vector< vector<double> > m; // массив длин промежуточных кратчайших путей
  10. vector<dot> dots;           // массив координат точек
  11. string s(80, '*');          // для красивой печати
  12.  
  13. // расстояние между точками
  14. double distance(int a, int b) {
  15.     return sqrt( pow((dots[b].first - dots[a].first), 2) + pow((dots[b].second - dots[a].second), 2) );
  16. }
  17.  
  18. // печать матрицы m
  19. void print_m() {
  20.     for (int i = 0; i < m.size() - 1; i++) {
  21.         for (int j = 0; j <= m.size(); j++) {
  22.             cout.setf(ios::left);
  23.             cout.width(8);
  24.             cout << m[i][j] << " ";
  25.         }
  26.         cout << endl;
  27.     }
  28. }
  29.  
  30. // для сортировки массива координат по возрастанию x
  31. bool cmp(const dot & d1, const dot & d2) {
  32.     return d1.first != d2.first ? d1.first < d2.first : d1.second < d2.second;
  33. }
  34.  
  35. int main(int argc, const char * argv[]) {
  36.     freopen("/Users/Alexander/Dropbox/Университет/CS242/euclidean traveling-salesman problem/euclidean traveling-salesman problem/input.txt", "r", stdin);
  37.    
  38.     int n;
  39.     cin >> n;
  40.     int NumberOfPoints = n;
  41.    
  42.     // выделение памяти и заполнение матриц
  43.     m.resize(n);
  44.     for (int i = 0; i < n; i++)
  45.         m[i].resize(n + 1);
  46.     for (int i = 0; i < n; i++) {
  47.         int x, y;
  48.         cin >> x >> y;
  49.         dots.push_back(make_pair(x, y));
  50.     }
  51.     sort(dots.begin(), dots.end(), cmp); // сортировка по х
  52.    
  53.    
  54.     //cout << distance(0, 1) + distance(1, 3) + distance(3, 5) + distance(5, 7) + distance(7, 8) + distance(8, 6) + distance(6, 4) + distance(4, 2) + distance(2, 0) << endl; // ответ
  55.    
  56.     m[0][1] = distance(0, 1);
  57.    
  58.     // расстановка длин путей из каждой вершины в каждую
  59.     for (int j = 2; j < NumberOfPoints; j++) {
  60.         for (int i = 0; i <= j - 2; i++)
  61.             m[i][j] = m[i][j - 1] + distance(j, j - 1);
  62.        
  63.         m[j - 1][j] = m[j-2][j - 1] + distance(j, j-2);
  64.        
  65. //        хз что это и зачем нужно вообще
  66. //        for (int i = 1; i <= j - 3; i++)
  67. //            if (m[j - 1][j] < m[i][j - 1] + distance(j, i))
  68. //                m[j - 1][j] = m[i][j - 1] + distance(j, i);
  69.        
  70. //        print_m();
  71. //        cout << endl << s << endl << endl;
  72.     }
  73.    
  74.     // зацикливание пути, поиск его длины
  75.     for (int i = 0; i < NumberOfPoints; i++)
  76.         m[i][NumberOfPoints] = m[i][NumberOfPoints - 1] + distance(i, NumberOfPoints - 1);
  77.    
  78.     print_m();
  79.     cout << endl << s << endl << endl;
  80.    
  81.    
  82.     double minWay = INT32_MAX;
  83.     for (int i = 0; i < NumberOfPoints - 1; i++)
  84.         if (minWay > m[i][NumberOfPoints])
  85.             minWay = m[i][NumberOfPoints];
  86.     cout << minWay << endl;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement