###### tags: `xivlo` # Zajęcia 17.03.2021 ## Minimalne drzewo rospinające (MST) https://pl.wikipedia.org/wiki/Minimalne_drzewo_rozpinaj%C4%85ce ## Algorytm Kruskala do wyznaczania MST Lista kroków: 1. Wczytaj zbiór krawędzi wraz z wagami * 2. Posortuj krawędzie rosnąco według wag ** 3. Dla każdej krawędzi $(w,(a,b))$ ze zbioru posortowanych krawędzi: a) Sprawdź, czy $a$ i $b$ są w jednym zbiorze połączonych wierzchołków *** b) Jeśli a) prawdziwe to złącz zbiory do których należą $a$ i $b$ ### Gwiazdki #### *) Zbiór krawędzi z wagami można trzymać w tablicy: ```cpp= pair< int, pair<int, int> > krawedzie[1003]; ``` #### *\*) Sortowanie zbioru krawędzi jest realizowane za pomocą funkcji `sort` z biblioteki `algorithm`: ```cpp= sort(krawedzie, krawedzie+m); ``` > gdzie $m$ to liczba krawędzi #### *\*\*) Można to zrealizować za pomocą funkcji Find, lub w trakcie funkcji Union ```cpp= bool Union(int a, int b){ int ra = Find(a); int rb = Find(b); if(ra==rb){ return false; } ... return true; } ... if(Union(a,b)){ //udalo sie }else{ //nie udalo sie } ``` ### Pary ```cpp= pair<int,int> tab[10]; pair<int,int> a = make_pair(1,2); pair< int, pair<int,int> > b = {3,{4,5}}; //make_pair(3,make_pair(4,5)); int c = a.first; int d = a.second; tab[0] = {9,10}; cout<<tab[0].first; //9 int e = b.second.first // 4 int f = b.second.second // 5 pair<int,int> g = b.second // {4,5} pair< int,pair<int,int> > krawedzie[1003]; for(int i=0; i<m; i++){ int a = krawedzie[i].second.first; int b = krawedzie[i].second.second; int w = krawedzie[i].first; ... } ```