Little_hobbit

Алгоритм Крускала (Краскала?)

Jun 13th, 2020
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. // Ребро : начало, конец и его длина
  8. struct edge
  9. {
  10.     int x;
  11.     int y;
  12.     int len;
  13. };
  14.  
  15. // Функция сравнения длин рёбер
  16. int compare(edge a, edge b)
  17. {
  18.     return a.len < b.len;
  19. }
  20.  
  21. int main( )
  22. {
  23.     // Количество вершин
  24.     int n;
  25.     cin >> n;
  26.  
  27.     // Массив рёбер графа
  28.     vector< edge > array_edge;
  29.  
  30.     // Массив принадлежности компанентам связности вершин графа
  31.     // v - вершина графа, comp[v] = n, где n - номер компоненты
  32.     vector< int > comp(n);
  33.     for (int i = 0; i < n; ++i)
  34.     {
  35.         // первоначально каждой вершине задаем свой номер компоненты
  36.         comp[i] = i;
  37.     }
  38.  
  39.     // Ввод графа
  40.     for (int i = 0; i < n; ++i)
  41.     {
  42.         for (int j = 0; j < n; ++j)
  43.         {
  44.             int dist;
  45.             cin >> dist;
  46.  
  47.             if (i < j && (dist != -1))
  48.             {
  49.                 // Добавление ребра к массиву ребёр
  50.                 edge new_e = {i, j, dist};
  51.                 array_edge.push_back(new_e);
  52.             }
  53.         }
  54.     }
  55.  
  56.     // Сортируем по неубыванию рёбра графа
  57.     sort(array_edge.begin( ), array_edge.end( ), compare);
  58.  
  59.     // Остов графа
  60.     vector< edge > tree;
  61.  
  62.     for (auto e_i : array_edge)
  63.     {
  64.         // Перебираем все рёбра из массива рёбер
  65.         if (comp[e_i.x] != comp[e_i.y])
  66.         {
  67.             // Если два конца ребра находятся в разных компонентах связности
  68.             // Добавляем это ребро в дерево
  69.             tree.push_back(e_i);
  70.  
  71.             // Записываем номер компоненты начала ребра и его конца
  72.             int comp_x = comp[e_i.x],
  73.                     comp_y = comp[e_i.y];
  74.  
  75.             // Проходим по всему списку компонент
  76.             for (int i = 0; i < n; ++i)
  77.             {
  78.                 // Если находим компоненту, равную конечной, присваиваем ей номер компоненты начала ребра.
  79.                 if (comp[i] == comp_y)
  80.                     comp[i] = comp_x;
  81.             }
  82.         }
  83.     }
  84.  
  85.     // Если дерево содержит n - 1 рёбер, где n - количество вершин
  86.     if (tree.size() == n - 1)
  87.     {
  88.         // То граф связный
  89.         int sum = 0;
  90.         for (auto k : tree)
  91.         {
  92.             sum += k.len;
  93.             cout << k.len << ' ';
  94.         }
  95.         cout << endl << sum << endl;
  96.     }
  97.     else
  98.     {
  99.         // В обратном случае граф несвязный
  100.         cout << "No connected graph" << endl;
  101.     }
  102.  
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment