minimum spanning tree tutorial
Цей підручник з C ++ пояснює, що таке мінімальне дерево розмаху (MST), а також алгоритми Прима та Крускала для пошуку MST у графіку та його застосування:
Дерево розмахування можна визначити як підмножину графа, яка складається з усіх вершин, що охоплюють мінімально можливі ребра, і не має циклу. Дерево обшивки не можна відключити.
Кожен зв’язаний і неорієнтований графік має принаймні одне охоплююче дерево. Відключений графік не має охоплюючого дерева, оскільки неможливо включити всі вершини.
=> Дивіться тут, щоб ознайомитися з повним списком підручників з C ++.
Що ви дізнаєтесь:
Обширне дерево в C ++
Розглянемо такий зв’язаний графік.
Як показано вище, для даного підключеного Графіка, що містить 3 вершини, ми маємо три обшивальні дерева. Загалом, якщо N - кількість вузлів у графіку, то повний зв’язаний графік має максимум NN-2кількість облягаючих дерев. Таким чином, на наведеному графіку N = 3, отже, він має 3(3-2)= 3 обшивні дерева.
Нижче перераховані деякі властивості обшивного дерева:
- Зв’язаний графік може мати більше одного охоплюючого дерева.
- Усі дерева, що охоплюють графік, мають однакову кількість вузлів і ребер.
- Якщо ми знімемо один край з дерева, що натягується, то він стане мінімально пов'язаний і зробить графік відключеним.
- З іншого боку, додавши один край до обшивного дерева, це зробить його максимально ациклічний тим самим створюючи цикл.
- Дерево, що охоплює, не має циклу або циклу.
Що таке мінімальне дерево, що охоплює (MST)
Мінімальне охоплююче дерево - це дерево, яке містить найменшу вагу серед усіх інших охоплюючих дерев пов'язаного зваженого графіка. Для графіка може бути більше одного мінімального дерева, що охоплює.
Є два найпопулярніші алгоритми, які використовуються для пошуку мінімального дерева, що охоплює графік.
Вони включають:
- Алгоритм Крускала
- Алгоритм Прима
Давайте обговоримо обидва ці алгоритми!
Алгоритм Крускала
Алгоритм Крускала - це алгоритм для пошуку MST у зв’язаному графі.
Алгоритм Крускала знаходить підмножину графа G таку, що:
- Він утворює дерево з кожною вершиною в ньому.
- Сума ваг є мінімальною серед усіх охоплюючих дерев, які можна сформувати з цього графіку.
Послідовність кроків для алгоритму Крускала наведена наступним чином:
- Спочатку відсортуйте всі краї від найменшої ваги до найбільшої.
- Візьміть край із найменшою вагою та додайте його до облягаючого дерева. Якщо цикл створений, відкиньте край.
- Продовжуйте додавати ребра, як на кроці 1, поки не будуть враховані всі вершини.
Псевдокод для алгоритму Крускала
Нижче наведено псевдокод алгоритму Крускала
А тепер давайте побачимо ілюстрацію алгоритму Крускала.
Тепер ми вибираємо край з найменшою вагою, який становить 2-4.
Далі виберіть наступний найкоротший край 2-3.
Потім ми вибираємо наступний край з найкоротшим краєм, і це не створює циклу, тобто 0-3
питання співбесіди з тестування веб-сервісів
Наступним кроком є вибір найкоротшого краю, щоб він не утворював циклу. Це 0-1.
Як ми бачимо, ми охопили всі вершини, і тут є дерево, що охоплює, з мінімальними витратами.
Далі ми застосуємо алгоритм Крускала за допомогою C ++.
#include #include #include using namespace std; #define graph_edge pair class Graph { private: int V; // number of nodes in graph vector> G; // vector for graph vector> T; // vector for mst int *parent; public: Graph(int V); void AddEdge(int u, int v, int wt); int find_set(int i); void union_set(int u, int v); void kruskal_algorithm(); void display_mst(); }; Graph::Graph(int V) { parent = new int(V); for (int i = 0; i Вихід:
Мінімальне дерево охоплення (MST) відповідно до алгоритму Крускала:
Край: вага
2 - 4: 1
2 - 3: 2
0 - 1: 3
0 - 3: 3
Зверніть увагу, що ми використовували той самий приклад графіка в програмі, що і на ілюстрації алгоритму Крускала вище. У цій реалізації ми використовуємо два вектори; один для зберігання графіка, а інший - для зберігання мінімального дерева, що охоплює. Ми рекурсивно знаходимо ребра з найменшою вагою та додаємо їх до вектора MST, доки всі вершини не буде покрито.
Алгоритм Прима
Алгоритм Прима - це ще один алгоритм для пошуку мінімуму, що охоплює дерево графіка. На відміну від алгоритму Крускала, який починається з ребер графіка, алгоритм Прима починається з вершини. Ми починаємо з однієї вершини і продовжуємо додавати ребра з найменшою вагою, поки всі вершини не будуть покриті.
Послідовність кроків для Алгоритму Прима така:
- Виберіть випадкову вершину як початкову і ініціалізуйте мінімальне дерево, що охоплює.
- Знайдіть ребра, які з’єднуються з іншими вершинами. Знайдіть край із мінімальною вагою та додайте його до облягаючого дерева.
- Повторюйте крок 2, поки не буде отримане дерево, що охоплює.
Псевдокод для алгоритму Прима

А тепер давайте побачимо ілюстрацію алгоритму Прима.
Для цього ми використовуємо той самий приклад графіка, який ми використовували в Ілюстрації алгоритму Крускала.

Виберемо вузол 2 як випадкову вершину.

Далі ми вибираємо край з найменшою вагою від 2. Вибираємо край 2-4.

Далі ми вибираємо іншу вершину, якої ще немає в дереві, що охоплює. Вибираємо ребро 2-3.

Тепер давайте виділимо ребро з найменшою вагою з наведених вершин. У нас є край 3-0, який має найменшу вагу.

Далі вибираємо ребро з найменшою вагою з вершини 0. Це ребро 0-1.

З наведеної вище фігури ми бачимо, що тепер ми охопили всі вершини на графіку і отримали повне охоплююче дерево з мінімальними витратами.
А тепер давайте реалізуємо алгоритм Prim у C ++.
Зауважте, що і в цій програмі ми використовували наведений вище приклад графіка як вхідні дані, щоб ми могли порівняти вихідні дані програми разом з ілюстрацією.
Програма подана нижче:
#include #include using namespace std; #define INF 9999 // graph contains 5 vertices #define V 5 // an array G that stores adjacency matrix for input graph int G(V)(V) = { {0, 3, 0, 3, 0}, {3, 0, 0, 0, 4}, {0, 0, 0, 2, 1}, {3, 3, 2, 0, 0}, {0, 4, 1, 0, 0}}; int main () { int num_edge; // number of edge // mst_vertex - array to track vertices selected for spanning tree int mst_vertex(V); // set selected false initially memset (mst_vertex, false, sizeof (mst_vertex)); // set number of edge to 0 num_edge = 0; //let 0th vertex be the first to be selected mst_vertex(0) = true; int x; // row int y; // col // print details of MST cout<<'The Minimum Spanning Tree as per Prim's Algorithm:'< G(i)(j)) { min = G(i)(j); x = i; y = j; } } } } } cout << x << ' - ' << y << ' : ' << G(x)(y); cout << endl; mst_vertex(y) = true; num_edge++; } return 0; }
Вихід:
Мінімальне дерево охоплення відповідно до алгоритму Прима:
Край: вага
0 - 1: 3
0 - 3: 3
3 - 2: 2
2 - 4: 1
Застосування обширного дерева
Деякі програми застосування мінімальних дерев, що пролітають, такі:
# 1) Налаштування мережі зв'язку: Коли ми хочемо створити комунікаційну мережу за допомогою ліній зв'язку, тоді вартість встановлення ліній зв'язку між двома точками найкраще визначати за допомогою MST.
# 2) Кластерний аналіз: Він може бути використаний для вирішення проблеми K-кластеризації шляхом пошуку мінімального дерева, що охоплює, та видалення k-1 найдорожчих країв.
# 3) Прокладання автомобільних / залізничних мереж: Коли ми прокладаємо різні автомобільні або залізничні мережі між містами або всередині них, вартість проекту є дуже важливим фактором. Ми можемо знайти найкращий шлях із мінімальними витратами, використовуючи мінімальні обшивні дерева.
# 4) Планування житлових об'єктів: Такі об'єкти, як електроенергія, вода, каналізація тощо, що надаються ряду будинків, також потребують оптимальних витрат, і це робиться за допомогою MST.
# 5) Вирішення проблеми мандрівного продавця: Ми можемо використовувати MST для вирішення проблеми продавця, що вимагає відвідування кожного пункту хоча б один раз.
Висновок
Мінімальним охоплюючим деревом є підмножина графіка g, і ця підмножина має всі вершини графіка, а загальна вартість ребер, що з'єднують вершини, мінімальна.
Ми обговорили два алгоритми, тобто Крускала та Прима, щоб знайти мінімальне дерево охоплення за графіком. У цьому посібнику також було пояснено додатки обширного дерева.
=> Ознайомтеся з найкращими навчальними посібниками з C ++ тут.
Рекомендована література
- Підручник з роздумів про Java з прикладами
- Структура даних дерева B та дерева B + у C ++
- Підручник з Python DateTime із прикладами
- Підручник з Bugzilla: Посібник із інструментів управління дефектами
- Структура даних двійкового дерева в C ++
- 20+ підручників MongoDB для початківців: Безкоштовний курс MongoDB
- MongoDB Підручник з шардування з прикладом
- MongoDB Створення підручника з бази даних