В тази статия ще обсъдим алгоритъма на Kruskal. Тук също ще видим сложността, работата, примера и изпълнението на алгоритъма на Kruskal.
Но преди да преминем директно към алгоритъма, първо трябва да разберем основните термини като spanning tree и minimal spanning tree.
Spanning Tree - Обхващащото дърво е подграф на неориентиран свързан граф.
Минимално обхващащо дърво - Минималното обхващащо дърво може да се дефинира като обхващащо дърво, в което сумата от теглата на ръба е минимална. Теглото на обхващащото дърво е сумата от теглата, дадени на ръбовете на обхващащото дърво.
Сега да започнем с основната тема.
Kruskal's Algorithm се използва за намиране на минималното обхващащо дърво за свързан претеглен график. Основната цел на алгоритъма е да намери подмножеството от ръбове, чрез които можем да обходим всеки връх на графиката. Той следва алчния подход, който намира оптимално решение на всеки етап, вместо да се фокусира върху глобален оптимум.
Как работи алгоритъмът на Kruskal?
В алгоритъма на Kruskal започваме от ръбове с най-ниско тегло и продължаваме да добавяме ръбовете, докато целта бъде достигната. Стъпките за прилагане на алгоритъма на Kruskal са изброени както следва -
- Първо сортирайте всички ръбове от ниско тегло към високо.
- Сега вземете ръба с най-ниско тегло и го добавете към обхващащото дърво. Ако ръбът, който трябва да се добави, създава цикъл, тогава отхвърлете ръба.
- Продължете да добавяте ръбовете, докато достигнем всички върхове и се създаде минимално обхващащо дърво.
Приложенията на алгоритъма на Kruskal са -
- Алгоритъмът на Kruskal може да се използва за оформление на електрически кабели между градовете.
- Може да се използва за установяване на LAN връзки.
Пример за алгоритъм на Kruskal
Сега, нека видим работата на алгоритъма на Крускал, използвайки пример. Ще бъде по-лесно да разберете алгоритъма на Kruskal, като използвате пример.
Да предположим, че една претеглена графика е -
Теглото на ръбовете на горната графика е дадено в таблицата по-долу -
Ръб, край | AB | AC | AD | НО | пр.н.е | CD | НА |
Тегло | 1 | 7 | 10 | 5 | 3 | 4 | 2 |
Сега сортирайте ръбовете, дадени по-горе, във възходящ ред на техните тегла.
Ръб, край | AB | НА | пр.н.е | CD | НО | AC | AD |
Тегло | 1 | 2 | 3 | 4 | 5 | 7 | 10 |
Сега нека започнем да конструираме минималното обхващащо дърво.
java локална дата и час
Етап 1 - Първо добавете ръба AB с тегло 1 към MST.
Стъпка 2 - Добавете ръба НА с тегло 2 към MST, тъй като не създава цикъла.
Стъпка 3 - Добавете ръба пр.н.е с тегло 3 към MST, тъй като не създава никакъв цикъл или цикъл.
Стъпка 4 - Сега изберете ръба CD с тегло 4 към MST, тъй като не формира цикъла.
Стъпка 5 - След това изберете ръба НО с тегло 5. Включването на този ръб ще създаде цикъла, така че го изхвърлете.
Стъпка 6 - Изберете ръба AC с тегло 7. Включването на този ръб ще създаде цикъла, така че го изхвърлете.
Стъпка 7 - Изберете ръба AD с тегло 10. Включването на този ръб също ще създаде цикъла, така че го изхвърлете.
И така, крайното минимално обхващащо дърво, получено от дадената претеглена графика с помощта на алгоритъма на Kruskal е -
Цената на MST е = AB + DE + BC + CD = 1 + 2 + 3 + 4 = 10.
Сега броят на ръбовете в горното дърво е равен на броя на върховете минус 1. И така, алгоритъмът спира тук.
Алгоритъм
Step 1: Create a forest F in such a way that every vertex of the graph is a separate tree. Step 2: Create a set E that contains all the edges of the graph. Step 3: Repeat Steps 4 and 5 while E is NOT EMPTY and F is not spanning Step 4: Remove an edge from E with minimum weight Step 5: IF the edge obtained in Step 4 connects two different trees, then add it to the forest F (for combining two trees into one tree). ELSE Discard the edge Step 6: END
Сложност на алгоритъма на Крускал
Сега нека видим времевата сложност на алгоритъма на Крускал.
Времевата сложност на алгоритъма на Kruskal е O(E logE) или O(V logV), където E е номерът. на ръбовете, а V е номерът. от върхове.
Реализация на алгоритъма на Крускал
Сега нека видим изпълнението на алгоритъма на Kruskal.
програма: Напишете програма за прилагане на алгоритъма на Kruskal в C++.
#include #include using namespace std; const int MAX = 1e4 + 5; int id[MAX], nodes, edges; pair <long long, pair> p[MAX]; void init() { for(int i = 0;i <max;++i) id[i]="i;" } int root(int x) { while(id[x] !="x)" id[x]="id[id[x]];" x="id[x];" return x; void union1(int x, y) p="root(x);" q="root(y);" id[p]="id[q];" long kruskal(pair<long long, pair> p[]) { int x, y; long long cost, minimumCost = 0; for(int i = 0;i <edges;++i) { x="p[i].second.first;" y="p[i].second.second;" cost="p[i].first;" if(root(x) !="root(y))" minimumcost +="cost;" union1(x, y); } return minimumcost; int main() x, y; long weight, cost, init(); cout <> nodes >> edges; for(int i = 0;i <edges;++i) { cout<> x >> y >> weight; p[i] = make_pair(weight, make_pair(x, y)); } sort(p, p + edges); minimumCost = kruskal(p); cout <<'minimum cost is '<< minimumcost << endl; return 0; } < pre> <p> <strong>Output</strong> </p> <img src="//techcodeview.com/img/ds-tutorial/85/kruskals-algorithm-6.webp" alt="Kruskal"> <p>So, that's all about the article. Hope the article will be helpful and informative to you.</p> <hr></'minimum></edges;++i)></edges;++i)></max;++i)></long>