Little_hobbit

Алгоритм Дейкстры

Jun 8th, 2020
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <list>
  4.  
  5. using namespace std;
  6.  
  7. int main( )
  8. {
  9.     // Количество вершин графа
  10.     int n;
  11.     cin >> n;
  12.    
  13.     // Списки смежности вершин с расстоянием
  14.     vector< vector< pair< int, int > > > G(n);
  15.    
  16.     // Массив посещённых вершин, иницилизируем 0
  17.     vector< bool > visited(n, false);
  18.    
  19.     // Массив расстояний из вершины from, инициализируем максимальным числом
  20.     vector< int > d(n, INT32_MAX);
  21.  
  22.    
  23.     // Ввод дерева
  24.     for (int i = 0; i < n; ++i)
  25.     {
  26.         for (int j = 0; j < n; ++j)
  27.         {
  28.             int dist;
  29.             cin >> dist;
  30.  
  31.             // Если пути из одной вершины в другой нет, то помечается как -1
  32.             if (dist > -1)
  33.             {
  34.                 G[i].push_back(make_pair(j, dist));
  35.                 //G[j].push_back(make_pair(i, dist)); // Неориентированный
  36.             }
  37.         }
  38.     }
  39.     //*****************************************
  40.    
  41.     // Вводим вершину начала
  42.     int from;
  43.     cin >> from;
  44.  
  45.     // Обозначаем путь до этой вершины 0 (путь из самой в себя)
  46.     d[from] = 0;
  47.     for (int i = 0; i < n; ++i)
  48.     {
  49.        
  50.         // Ищем вершину с минимальным расстоянием от начальной вершины from
  51.         int min_v = INT32_MAX;
  52.         for (int k = 0; k < n; ++k)
  53.         {
  54.             if ((min_v == INT32_MAX || d[k] < d[min_v]) && !visited[k])
  55.                 min_v = k;
  56.         }
  57.  
  58.         // Если нашлась такая минимальная
  59.         if (min_v != INT32_MAX && d[min_v] != INT32_MAX)
  60.         {
  61.             // Посещаем её
  62.             visited[min_v] = true;
  63.  
  64.             // Проходим смежные ей вершины
  65.             for (auto v : G[min_v])
  66.             {
  67.                 // Если в них не заходили
  68.                 if (!visited[v.first])
  69.                 {
  70.                     // Расстояние от начальной вершины до смежных минимальной вершине
  71.                     // Которые не помещали будет равно минимуму из
  72.                     // Расстояния от from до самой смежной вершины
  73.                     // и
  74.                     // Расстояния от from до минимальной + расстояние от минимальной до смежной ей
  75.                     d[v.first] = min(d[v.first], d[min_v] + v.second);
  76.                 }
  77.             }
  78.  
  79.         }
  80.         else break;
  81.  
  82.  
  83.     }
  84.  
  85.     // Выводим расстояния из начальной вершины до всех остальных
  86.     // т.е расстояние d[3] расстояние от вершины from до 4-й
  87.     for (int i = 0; i < n; ++i)
  88.     {
  89.         cout << d[i]<< ' ';
  90.     }
  91.  
  92.  
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment