Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- struct Edge // структура для представления взвешенного ребра в графе
- {
- int f, t, w;
- };
- class Graph // структура для представления подключенной, ненаправленной и взвешенный граф как набор ребер.
- {
- public:
- int V, E;// V->Количество вершин, E->Количество ребер
- vector<Edge> edge;// массив ребер;
- Graph(int v, int e) : V(v), E(e) { edge.resize(E); }
- };
- int Find(int parent[], int i) // функция для поиска множества элементов
- {
- if (parent[i] == i)
- return i;
- return Find(parent, parent[i]);
- };
- void Union(int parent[], int x, int y) // Функция, которая объединяет два набора x и y
- {
- int xroot = Find(parent, x);
- int yroot = Find(parent, y);
- parent[xroot] = yroot;
- };
- void boruvkaMST(Graph& graph)// Основная функция для MST с использованием алгоритма Борувки
- {
- int V = graph.V, E = graph.E; vector<Edge> edge = graph.edge;// Получить данные данного графика
- int* parent = new int[V];// Массив для хранения индекса компоненты связности
- int* cheapest = new int[V];// Массив для хранения индекса вершины из дерева с самым дешевым ребром в другое дерево
- for (int i = 0; i < V; ++i) // изначально каждая вершина отдельное дерево
- parent[i] = i;
- int numTrees = V;// Изначально существует V разных деревьев. Наконец, будет одно дерево, которое будет MST
- int MSTw = 0;
- while (numTrees > 1)// Продолжаем комбинировать компоненты (или наборы), пока все Компоненты не объединяются в один MST.
- {
- for (int i = 0; i < V; ++i)// Каждый раз инициализируем самый дешевый массив
- cheapest[i] = -1;
- for (int i = 0; i < E; i++)// Пройдите через все ребра и обновите самый дешевый из каждого компонента
- {
- int set1 = Find(parent, edge[i].f); // Находим в каких компонентах лежат концы ребра
- int set2 = Find(parent, edge[i].t);
- if (set1 != set2) // Если две вершины из разных компонент, то проверяем не являются эти ребра минимальные по весу
- {
- if (cheapest[set1] == -1 || edge[cheapest[set1]].w > edge[i].w)
- cheapest[set1] = i;
- if (cheapest[set2] == -1 || edge[cheapest[set2]].w > edge[i].w)
- cheapest[set2] = i;
- } }
- for (int i = 0; i < V; i++)// Рассмотрим выбранные выше самые дешевые ребра и добавим их в MST
- {
- if (cheapest[i] != -1)// Проверяем, существует ли самый дешевый для текущего набора
- {
- int set1 = Find(parent, edge[cheapest[i]].f);
- int set2 = Find(parent, edge[cheapest[i]].t);
- if (set1 != set2)
- {
- MSTw += edge[cheapest[i]].w;
- cout << edge[cheapest[i]].f << '-' << edge[cheapest[i]].t << " Edge included in MST with weight " << edge[cheapest[i]].w << endl;
- Union(parent, set1, set2);// Делаем объединение set1 и set2 и уменьшаем число деревьев
- numTrees--;
- } } } }
- cout << "Weight of MST is " << ' ' << MSTw << endl;
- return;
- }
- int main()
- {
- int V, E; // Количество вершин в графе и Количество ребер в графе
- cin >> V >> E;
- Graph graph(V, E);
- for (size_t i = 0; i < E; i++)
- cin >> graph.edge[i].f >> graph.edge[i].t >> graph.edge[i].w;
- boruvkaMST(graph);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement