Advertisement
Little_hobbit

Нахождение минимального остовного дерева - алгоритм Прима

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