minimum spanning tree tutorial
Ta vadnica za C ++ pojasnjuje, kaj je minimalno drevo, ki se razteza (MST), skupaj z algoritmi Prim in Kruskal za iskanje MST v grafu in njegove aplikacije:
Drsno drevo lahko definiramo kot podskupino grafa, ki je sestavljena iz vseh točk, ki pokrivajo najmanjše možne robove in nima cikla. Povezovalnega drevesa ni mogoče odklopiti.
Vsak povezan in neusmerjen graf ima vsaj eno drevo. Nepovezan graf nima razteznega drevesa, saj ni mogoče vključiti vseh točk.
=> Za ogled celotnega seznama vadnic za C ++ glejte tukaj.
Kaj se boste naučili:
Raztezajoče se drevo v jeziku C ++
Upoštevajte naslednji povezani graf.
Kot je prikazano zgoraj, imamo za dani povezani graf, ki vsebuje 3 oglišča, tri drevesa. Na splošno, če je N število vozlišč v grafu, ima popoln povezan graf največ NN-2število dreves, ki se raztezajo. Tako ima v zgornjem grafu N = 3 torej 3(3-2)= 3 drevesa.
Nekatere lastnosti raztezajočega se drevesa so navedene spodaj:
- Povezani graf ima lahko več dreves, ki se raztezajo.
- Vsa drevesa v grafu imajo enako število vozlišč in robov.
- Če odstranimo en rob z drevesa, ki se razteza, bo to postalo minimalno povezan in bo graf odklopljen.
- Po drugi strani pa bo dodajanje enega roba na raztegnjeno drevo uspelo maksimalno acikličen s tem ustvari zanko.
- Obsegajoče drevo nima zanke ali cikla.
Kaj je minimalno drevo (MST)
Najmanjše raztezajoče se drevo je tisto, ki vsebuje najmanj uteži med ostalimi raztezajočimi se drevesi povezanega tehtanega grafa. Za graf je lahko več kot eno minimalno drevo, ki se razteza.
Obstajata dva najbolj priljubljena algoritma, ki se uporabljata za iskanje najmanjšega drevesa v grafu.
Vključujejo:
- Kruskalov algoritem
- Primov algoritem
Pogovorimo se o obeh algoritmih!
Kruškalov algoritem
Kruskalov algoritem je algoritem za iskanje MST v povezanem grafu.
Kruskalov algoritem najde tako podskupino grafa G, da:
- Oblikuje drevo z vsako točko v njem.
- Vsota uteži je najmanjša med vsemi razponimi drevesi, ki jih lahko oblikujemo iz tega grafa.
Zaporedje korakov za Kruskalov algoritem je podano tako:
- Najprej razvrstite vse robove od najmanjše teže do največje.
- Vzemite rob z najmanjšo težo in ga dodajte drevesu. Če je cikel ustvarjen, zavrzite rob.
- Nadaljujte z dodajanjem robov, kot v koraku 1, dokler ne upoštevate vseh točk.
Psevkodo za Kruškalov algoritem
Spodaj je psevdo-koda za Kruskalov algoritem
Zdaj pa si oglejmo ponazoritev Kruskalovega algoritma.
Zdaj izberemo rob z najmanjšo težo, ki je 2-4.
Nato izberite naslednji najkrajši rob 2-3.
Nato izberemo naslednji rob z najkrajšim robom in to ne ustvari cikla, tj. 0-3
kaj je najboljše odstranjevanje virusov
Naslednji korak je izbira najkrajšega roba, tako da ne tvori cikla. To je 0-1.
Kot lahko vidimo, smo pokrili vse oglišča in tukaj imamo zajeto drevo z minimalnimi stroški.
Nato bomo s pomočjo C ++ implementirali Kruskalov algoritem.
#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 Izhod:
Najmanjše drevesno drevo (MST) v skladu s Kruskalovim algoritmom:
Rob: teža
2 - 4: 1
2 - 3: 2
0 - 1: 3
0 - 3: 3
Upoštevajte, da smo v programu uporabili isti primer grafa, kot smo ga uporabili na ilustraciji zgornjega algoritma Kruskal. Pri tej izvedbi uporabljamo dva vektorja; ena za shranjevanje grafa in druga za shranjevanje najmanjšega drevesa. Rekurzivno poiščemo robove z najmanjšo težo in jih dodamo vektorju MST, dokler niso zajeti vsi točki.
Primov algoritem
Primov algoritem je še en algoritem za iskanje najmanjšega obsega drevesa grafa. V nasprotju s Kruskalovim algoritmom, ki se začne z robovi grafa, se Primov algoritem začne z ogliščem. Začnemo z eno točko in nadaljujemo z dodajanjem robov z najmanjšo težo, dokler niso zajeti vsi točki.
Zaporedje korakov za Primov algoritem je naslednje:
- Izberite naključno točko kot začetno točko in inicializirajte minimalno drevo, ki se razteza.
- Poiščite robove, ki se povezujejo z drugimi oglišči. Poiščite rob z minimalno težo in ga dodajte drevesu.
- Ponavljajte 2. korak, dokler ne dobite drevesa, ki se razteza.
Psevkodo za Primov algoritem
Zdaj pa si oglejmo ponazoritev Primovega algoritma.
Za to uporabljamo isti primer grafa, ki smo ga uporabili v ilustraciji algoritma Kruskal.
Za naključno oglišče izberite vozlišče 2.
Nato izberemo rob z najmanjšo težo od 2. Izberemo rob 2-4.
Nato izberemo drugo točko, ki je še ni v drevesu. Izberemo rob 2-3.
Zdaj izberemo rob z najmanjšo težo med zgornjimi točkami. Imamo rob 3-0, ki ima najmanjšo težo.
Nato iz oglišča izberemo rob z najmanjšo težo. To je rob 0-1.
Iz zgornje slike vidimo, da smo zdaj pokrili vse točke na grafu in dobili popolno drevo z minimalnimi stroški.
Zdaj pa uporabimo Primov algoritem v jeziku C ++.
Upoštevajte, da smo tudi v tem programu uporabili zgornji primer grafa kot vhod, da lahko primerjamo izhodne podatke programa skupaj z ilustracijo.
Program je podan spodaj:
#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; }
Izhod:
Najmanjše drevo, ki se razteza po Primovem algoritmu:
Rob: teža
0 - 1: 3
0 - 3: 3
3 - 2: 2
2 - 4: 1
Uporabe raztegljivega drevesa
Nekatere aplikacije dreves z minimalnim razponom so naslednje:
# 1) Nastavitev komunikacijskega omrežja: Kadar želimo vzpostaviti komunikacijsko omrežje z uporabo komunikacijskih povezav, potem stroške vzpostavitve komunikacijskih povezav med dvema točkama najbolje določimo z uporabo MST.
# 2) Analiza grozdov: Uporablja se lahko za reševanje problema združevanja v skupine K z iskanjem minimalnega drevesa in brisanjem najdražjih robov k-1.
# 3) Postavitev cestnih / železniških omrežij: Ko postavimo različna cestna ali železniška omrežja med mesti ali znotraj njih, so stroški projekta zelo pomemben dejavnik. Najmanjšo pot z najnižjimi stroški lahko najdemo z uporabo minimalnih dreves.
# 4) Načrtovanje stanovanjskih objektov: Objekti, kot so elektrika, voda, kanalizacija itd., Ki jih je treba zagotoviti številnim hišam, morajo biti tudi z optimalnimi stroški, kar se opravi z uporabo MST.
# 5) Reševanje problema potujočega prodajalca: Z MST lahko rešimo težavo trgovskega potnika, ki mora vsako točko obiskati vsaj enkrat.
Zaključek
Najmanjše drevo, ki se razteza, je podmnožica grafa g in ta podmnožica ima vse oglišča grafa, skupni stroški robov, ki povezujejo oglišča, pa so najmanjši.
Razpravljali smo o dveh algoritmih, to je Kruskalovem in Primovem, da smo na grafu našli minimalno drevo, ki se razteza. Tukaj so v tej vadnici razložene tudi aplikacije drevesa, ki se razteza.
=> Tukaj si oglejte najboljše vadnice za C ++.
Priporočeno branje
- Vadnica za refleksijo Java s primeri
- Struktura podatkov o drevesu B in drevesu B + v jeziku C ++
- Vadnica Python DateTime s primeri
- Vadnica za Bugzilla: Praktična vadnica o orodju za upravljanje napak
- Struktura podatkov binarnega drevesa v jeziku C ++
- 20+ MongoDB vadnica za začetnike: brezplačen tečaj MongoDB
- MongoDB Vadnica za osenčenje s primerom
- MongoDB Vadnica za ustvarjanje zbirke podatkov