Advertisement
stas224

Алгоритм Борувки 2.0 (lite)

Dec 28th, 2021
34
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5. struct Edge // структура для представления взвешенного ребра в графе
  6. {
  7. int f, t, w;
  8. };
  9. class Graph // структура для представления подключенной, ненаправленной и взвешенный граф как набор ребер.
  10. {
  11. public:
  12. int V, E;// V->Количество вершин, E->Количество ребер
  13. vector<Edge> edge;// массив ребер;
  14. Graph(int v, int e) : V(v), E(e) { edge.resize(E); }
  15. };
  16. int Find(int parent[], int i) // функция для поиска множества элементов
  17. {
  18. if (parent[i] == i)
  19. return i;
  20. return Find(parent, parent[i]);
  21. };
  22. void Union(int parent[], int x, int y) // Функция, которая объединяет два набора x и y
  23. {
  24. int xroot = Find(parent, x);
  25. int yroot = Find(parent, y);
  26. parent[xroot] = yroot;
  27. };
  28. void boruvkaMST(Graph& graph)// Основная функция для MST с использованием алгоритма Борувки
  29. {
  30. int V = graph.V, E = graph.E; vector<Edge> edge = graph.edge;// Получить данные данного графика
  31. int* parent = new int[V];// Массив для хранения индекса компоненты связности
  32. int* cheapest = new int[V];// Массив для хранения индекса вершины из дерева с самым дешевым ребром в другое дерево
  33. for (int i = 0; i < V; ++i) // изначально каждая вершина отдельное дерево
  34. parent[i] = i;
  35. int numTrees = V;// Изначально существует V разных деревьев. Наконец, будет одно дерево, которое будет MST
  36. int MSTw = 0;
  37. while (numTrees > 1)// Продолжаем комбинировать компоненты (или наборы), пока все Компоненты не объединяются в один MST.
  38. {
  39. for (int i = 0; i < V; ++i)// Каждый раз инициализируем самый дешевый массив
  40. cheapest[i] = -1;
  41. for (int i = 0; i < E; i++)// Пройдите через все ребра и обновите самый дешевый из каждого компонента
  42. {
  43. int set1 = Find(parent, edge[i].f); // Находим в каких компонентах лежат концы ребра
  44. int set2 = Find(parent, edge[i].t);
  45. if (set1 != set2) // Если две вершины из разных компонент, то проверяем не являются эти ребра минимальные по весу
  46. {
  47. if (cheapest[set1] == -1 || edge[cheapest[set1]].w > edge[i].w)
  48. cheapest[set1] = i;
  49. if (cheapest[set2] == -1 || edge[cheapest[set2]].w > edge[i].w)
  50. cheapest[set2] = i;
  51. } }
  52. for (int i = 0; i < V; i++)// Рассмотрим выбранные выше самые дешевые ребра и добавим их в MST
  53. {
  54. if (cheapest[i] != -1)// Проверяем, существует ли самый дешевый для текущего набора
  55. {
  56. int set1 = Find(parent, edge[cheapest[i]].f);
  57. int set2 = Find(parent, edge[cheapest[i]].t);
  58. if (set1 != set2)
  59. {
  60. MSTw += edge[cheapest[i]].w;
  61. cout << edge[cheapest[i]].f << '-' << edge[cheapest[i]].t << " Edge included in MST with weight " << edge[cheapest[i]].w << endl;
  62. Union(parent, set1, set2);// Делаем объединение set1 и set2 и уменьшаем число деревьев
  63. numTrees--;
  64. } } } }
  65. cout << "Weight of MST is " << ' ' << MSTw << endl;
  66. return;
  67. }
  68. int main()
  69. {
  70. int V, E; // Количество вершин в графе и Количество ребер в графе
  71. cin >> V >> E;
  72. Graph graph(V, E);
  73. for (size_t i = 0; i < E; i++)
  74. cin >> graph.edge[i].f >> graph.edge[i].t >> graph.edge[i].w;
  75. boruvkaMST(graph);
  76. return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement