Advertisement
allia

небоскреб

Jan 8th, 2021 (edited)
935
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include<iostream>
  2. #include <cmath>
  3. using namespace std;
  4.  
  5. const int inf = 10000000;
  6. struct travel
  7. {
  8.  int begin, end, cost;
  9.  void new_travel(int begin, int end, int cost)
  10.  {
  11.    this->begin = begin;
  12.    this->end = end;
  13.    this->cost = cost;
  14.  }
  15. };
  16.  
  17. class Graph
  18. {
  19.   private:
  20.   int n, **arr, shet_lift_travel, const_koef, *d;
  21.   travel *vse_rebra;
  22.  
  23.   public:
  24.   Graph (travel *matrix, int x, int m, int c)
  25.   {
  26.     n = x;
  27.     shet_lift_travel = m;
  28.     const_koef = c;
  29.     vse_rebra = matrix;
  30.     d = new int[n];
  31.  
  32.     arr = new int*[n];
  33.  
  34.     for (int i = 0; i < n; i++)
  35.      arr[i] = new int[n];
  36.  
  37.     for (int i = 0; i < n; i++)
  38.      for (int j = 0; j < n; j++)
  39.         {
  40.           arr[i][j] = inf;
  41.           if (i == j)
  42.           arr[i][j] = -1;
  43.         }
  44.  
  45.     for (int i = 0; i < shet_lift_travel; i++)
  46.       {
  47.         arr[vse_rebra[i].begin][vse_rebra[i].end] = vse_rebra[i].cost;
  48.         arr[vse_rebra[i].end][vse_rebra[i].begin] = vse_rebra[i].cost;
  49.       }
  50.  
  51.     for (int i = 0; i < n; i++)
  52.      for (int j = 0; j < n; j++)
  53.         arr[i][j] = min (abs(j-i)*const_koef, arr[i][j]);
  54.   }
  55.   void get_array();
  56.   void minpath(int x);
  57.   int get_length_path(int x, int y);
  58. };
  59.  
  60. void Graph::minpath(int x)
  61. {
  62.   int w, min, j;
  63.   bool *old = new bool[n];
  64.   int *path = new int[n];
  65.  
  66.   for ( int i = 0; i < n; i++)
  67.   {
  68.     d[i] = arr[x][i];
  69.     old[i] = false;
  70.     path[i] = x;
  71.   }
  72.  
  73.   old[x] = true;
  74.  
  75.  for (int i = 1; i < n; i++)
  76.    {
  77.      for ( w = -1, min = inf, j = 0; j < n; j++)
  78.       if (!old[j] && d[j] < min)
  79.       {
  80.         w = j;
  81.         min = d[j];
  82.       }
  83.      if (w < 0)
  84.         break;
  85.  
  86.      for (old[w] = true, j = 0; j < n; j++)
  87.       if (!old[j] && d[j] > d[w] + arr[w][j])
  88.       {
  89.         d[j] = d[w] + arr[w][j];
  90.         path[j] = w;
  91.       }
  92.   }
  93.  
  94. delete [] old;
  95. }
  96.  
  97. int Graph::get_length_path(int x, int y)
  98. {
  99.  int dlina = 0;
  100.   minpath(x);
  101.  
  102.  dlina = d[y];
  103.  return dlina;
  104. }
  105.  
  106. void Graph::get_array()
  107. {
  108.   for (int i = 0; i < n; i++)
  109.    {
  110.      for(int j = 0; j < n; j++)
  111.       {
  112.         cout.width(3);
  113.         cout << arr[i][j] << " ";
  114.       }
  115.       cout << endl;
  116.    }
  117. }
  118.  
  119. int main()
  120. {
  121.  int n, m, koef_slov, floor_begin = 0, floor_end = 0, a = 0, b = 0, slova = 0;
  122.  
  123.  cin >> n >> m >> koef_slov;
  124.  cin >> floor_begin >> floor_end;
  125.  
  126. travel *arr = new travel[m];
  127.  
  128. for (int i = 0; i < m; i++)
  129.   {
  130.     cin >> a >> b >> slova;
  131.     a--;
  132.     b--;
  133.     arr[i].new_travel(a, b, slova);
  134.   }
  135.  
  136.  Graph object(arr, n, m, koef_slov);
  137.  cout << object.get_length_path(floor_begin-1, floor_end-1);
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement