minimum spanning tree tutorial
Tento výukový program C ++ vysvětluje, co je minimální rozpětí stromu (MST) spolu s algoritmy Prim a Kruskal pro vyhledání MST v grafu a jeho aplikace:
Spanning tree lze definovat jako podmnožinu grafu, který se skládá ze všech vrcholů pokrývajících minimální možné hrany a nemá cyklus. Rozpínací strom nelze odpojit.
Každý propojený a neorientovaný graf má alespoň jeden kostru. Odpojený graf nemá kostru, protože není možné zahrnout všechny vrcholy.
=> Prohlédněte si zde Úplný seznam výukových programů C ++.
Co se naučíte:
Spanning Tree In C ++
Zvažte následující připojený graf.
Jak je uvedeno výše, pro daný připojený Graf obsahující 3 vrcholy máme tři kostry. Obecně platí, že pokud N je počet uzlů v grafu, pak úplný připojený graf má maximum NN-2počet koster. Ve výše uvedeném grafu tedy N = 3, má tedy 3(3-2)= 3 kostry.
Některé z vlastností kostry jsou uvedeny níže:
- Připojený graf může mít více než jeden překlenující stromy.
- Všechny kostry v grafu mají stejný počet uzlů a hran.
- Pokud odstraníme jednu hranu ze stromu, stane se minimálně připojeno a způsobí odpojení grafu.
- Na druhou stranu přidáním jedné hrany do překlenovacího stromu to uděláte maximálně acyklický čímž se vytvoří smyčka.
- Rozpínací strom nemá smyčku ani cyklus.
Co je minimální rozpětí (MST)
Minimální spanning tree je ten, který obsahuje nejmenší váhu ze všech ostatních spanning tree připojeného váženého grafu. Pro graf může existovat více než jeden minimální kostra.
Existují dva nejpopulárnější algoritmy, které se používají k nalezení stromu minimálního rozsahu v grafu.
Obsahují:
- Kruskalův algoritmus
- Primův algoritmus
Pojďme diskutovat o obou těchto algoritmech!
Kruskalův algoritmus
Kruskalův algoritmus je algoritmus k vyhledání MST v připojeném grafu.
Kruskalův algoritmus najde podmnožinu grafu G takovou, že:
- Tvoří strom s každým vrcholem.
- Součet vah je minimální mezi všemi kostry, které lze z tohoto grafu vytvořit.
Pořadí kroků pro Kruskalův algoritmus je uvedeno následovně:
- Nejprve roztřiďte všechny hrany od nejnižší hmotnosti po nejvyšší.
- Vezměte hranu s nejnižší hmotností a přidejte ji do kostry. Pokud je cyklus vytvořen, okraj zahoďte.
- Pokračujte v přidávání hran jako v kroku 1, dokud nebudou zohledněny všechny vrcholy.
Pseudokód pro Kruskalův algoritmus
Níže je uveden pseudokód pro Kruskalův algoritmus
Nyní se podívejme na ilustraci Kruskalova algoritmu.
Nyní vybereme hranu s nejnižší hmotností, která je 2-4.
Dále vyberte další nejkratší hranu 2-3.
Poté zvolíme další hranu s nejkratší hranou, která nevytvoří cyklus, tj. 0-3
jak používat soubor apk
Dalším krokem je výběr nejkratší hrany tak, aby netvořila cyklus. To je 0-1.
Jak vidíme, pokryli jsme všechny vrcholy a máme zde kostru s minimálními náklady.
Dále implementujeme Kruskalův algoritmus pomocí 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 Výstup:
Minimum Spanning Tree (MST) podle Kruskalova algoritmu:
Hrana: Hmotnost
2 - 4: 1
2: 3: 2
0 - 1: 3
0-3: 3
Všimněte si, že jsme v programu použili stejný ukázkový graf, jaký jsme použili při ilustraci Kruskalova algoritmu výše. V této implementaci využíváme dva vektory; jeden pro uložení grafu a druhý pro uložení minimálního kostry. Rekurzivně najdeme hrany s nejmenší váhou a přidáme je do vektoru MST, dokud nejsou pokryty všechny vrcholy.
Primův algoritmus
Primův algoritmus je dalším algoritmem pro nalezení minima překlenujícího strom grafu. Na rozdíl od Kruskalova algoritmu, který začíná hranami grafu, Primův algoritmus začíná vrcholem. Začínáme s jedním vrcholem a neustále přidáváme hrany s nejmenší váhou, dokud nejsou pokryty všechny vrcholy.
Pořadí kroků pro Primův algoritmus je následující:
- Vyberte náhodný vrchol jako počáteční vrchol a inicializujte minimální kostru.
- Najděte hrany, které se připojují k jiným vrcholům. Najděte hranu s minimální hmotností a přidejte ji do kostry.
- Opakujte krok 2, dokud nezískáte kostru.
Pseudokód pro Primův algoritmus
Nyní se podívejme na ilustraci Primova algoritmu.
K tomu používáme stejný ukázkový graf, který jsme použili v ilustraci Kruskalova algoritmu.
Vyberme uzel 2 jako náhodný vrchol.
Dále vybereme hranu s nejmenší hmotností z 2. Vybereme hranu 2-4.
Dále vybereme další vrchol, který ještě není v kostře. Vybereme okraj 2-3.
Nyní vybereme hranu s nejmenší hmotností z výše uvedených vrcholů. Máme hranu 3: 0, která má nejnižší váhu.
Dále vybereme hranu s nejmenší váhou z vrcholu 0. Toto je hrana 0-1.
Z výše uvedeného obrázku vidíme, že jsme nyní pokryli všechny vrcholy v grafu a získali kompletní kostru s minimálními náklady.
Nyní pojďme implementovat Primův algoritmus v C ++.
Všimněte si, že i v tomto programu jsme jako vstup použili výše uvedený příklad grafu, abychom mohli porovnat výstup daný programem spolu s ilustrací.
Program je uveden níže:
#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; }
Výstup:
Minimum Spanning Tree podle Algoritmu Prim:
Hrana: Hmotnost
0 - 1: 3
0-3: 3
3: 2: 2
2 - 4: 1
Aplikace Spanning Tree
Některé z aplikací Minimálního rozpětí stromů jsou následující:
# 1) Nastavení komunikační sítě: Když chceme nastavit komunikační síť pomocí komunikačních spojů, pak se náklady na nastavení komunikačních spojů mezi dvěma body nejlépe určí pomocí MST.
# 2) Klastrová analýza: Může být použit k vyřešení problému s klastrováním K nalezením minimálního kostry a odstraněním nejdražších hran k-1.
# 3) Rozložení silničních / železničních sítí: Když položíme různé silniční nebo železniční sítě mezi městy nebo uvnitř měst, náklady na projekt jsou velmi důležitým faktorem. Můžeme najít nejlepší cestu s minimálními náklady s použitím minimálních koster.
# 4) Plánování bytových zařízení: Zařízení, jako je elektřina, voda, kanalizace atd., Které mají být poskytovány řadě domů, také vyžadují optimální náklady, a to pomocí MST.
# 5) Řešení problému obchodního cestujícího: MST můžeme použít k vyřešení problému obchodního cestujícího, který vyžaduje navštívit každý bod alespoň jednou.
Závěr
Minimální kostra je podmnožinou grafu g a tato podmnožina má všechny vrcholy grafu a celková cena hran spojujících vrcholy je minimální.
Diskutovali jsme o dvou algoritmech, tj. Kruskalově a Primově, abychom z grafu našli minimální kostru. V tomto výukovém programu zde byly vysvětleny také aplikace překlenovacího stromu.
=> Podívejte se na nejlepší výukové kurzy C ++ zde.
Doporučené čtení
- Výukový program Java Reflection s příklady
- Datová struktura stromu B a stromu B + v C ++
- Výukový program Python DateTime s příklady
- Výukový program Bugzilla: Výukový program pro správu defektů
- Struktura dat binárního stromu v C ++
- 20+ výuka MongoDB pro začátečníky: bezplatný kurz MongoDB
- Výukový program MongoDB Sharding s příkladem
- Výukový program pro vytváření databáze MongoDB