Szkic algorytmu Kruskala:
Każde drzewo lasu jest reprezentowane przez zbiór wierzchołków (zbiory te są rozłączne).
Należy zaimplementować następujące funkcje:
/* -------------------------------------------- implementacja rozlacznych zbiorow -------------------------------------------- */ struct ElZbioru { ElZbioru *nastepny; ElZbioru *reprezentant; }; ElZbioru Zbior[N]; void UtworzZbior(int a) // a=0..N-1 { // tworzy 1-elementowy zbior z reprezentantem "a" } int ZnajdzZbior(int a) { // zwraca reprezentanta zbioru zawierajacego "a"; // jeśli dla elementow "b" i "c" ta funkcja // zwroci tego samego reprezentanta, to oznacza to że // oba elementy należą do tego samego zbioru ! } void SumaZbiorow(int a, int b) { // laczy zbior zawierajacy "a" ze zbiorem zawierajacym "b" // reprezentantem sumy zbiorow moze byc dowolny jej element } void PokazZbiory() // tylko do celow testowych ... { }Graf ma być reprezentowany przy pomocy list sąsiadów, jak to widać na następującym rysunku:
Należy zaimplementować następujące funkcje:
/* -------------------------------------------- implementacja grafu (listy sasiadow) -------------------------------------------- */ struct Sasiad { Sasiad *nastepny; int IndWierz; int Waga; }; Sasiad *Graf[N]; void DodajKrawedz(int v, int u, int Waga) { // nalezy kontrolowac czy nie ma "krawedzi wielokrotnych" } void PokazGraf() // tylko do celow testowych ... { }Sortowanie krawędzi wg wag należy wykonać przy pomocy następujących funkcji:
/* -------------------------------------------- sortowanie krawedzi wg wag -------------------------------------------- */ struct KrawZWaga { int v,u,Waga; }; KrawZWaga Krawedz[N*N]; int IloscKraw=0; void KrawedzieDoTablicy() { // przepisuje krawedzie z grafu do tablicy "Krawedz" // aktualizując odpowiednio zmienna "IloscKraw" } void SortujKrawedzie() // niemalejaco wg wag { } void WypiszKrawedzie() // tylko do celow testowych ... { }Algorytm Kruskala powinien zapisywać krawędzie w "liście A" :
/* -------------------------------------------- Algorytm MST Kruskala -------------------------------------------- */ struct KrawZWaga2 { int v,u,Waga; KrawZWaga2 *nastepny; }; KrawZWaga2 *ListaA; void DodajKrawDoListyA(int v, int u, int Waga) { } void PokazListeAorazLacznaWage() { } void Kruskal() { // algorytm ... }Należy wypróbować algorytm w następujący sposób:
main() { printf("\n\n----------------------------------------\n"); /* // prosty przyklad ... // DodajKrawedz(0,1,1000); DodajKrawedz(1,2,999); DodajKrawedz(2,0,1000); PokazGraf(); KrawedzieDoTablicy(); SortujKrawedzie(); Kruskal(); PokazListeAorazLacznaWage(); */ DodajKrawedz(0,1,8); DodajKrawedz(1,2,7); DodajKrawedz(3,0,4); DodajKrawedz(4,1,2); DodajKrawedz(1,8,4); DodajKrawedz(2,5,9); DodajKrawedz(3,6,8); DodajKrawedz(6,4,7); DodajKrawedz(7,4,6); DodajKrawedz(6,7,1); DodajKrawedz(7,8,2); DodajKrawedz(2,8,14); DodajKrawedz(8,5,10); PokazGraf(); KrawedzieDoTablicy(); SortujKrawedzie(); Kruskal(); PokazListeAorazLacznaWage(); // Waga drzewa powinna być = 37 !!! }
Zadanie domowe 3
Zadanie domowe 4
1.uzyskiwanie wskazania na strukturę Wierzchołek na podstawie
identyfikatora wierzchołka
2.dodawanie potomka do dowolnego wierzchołka drzewa
3.wypisywanie elementów drzewa (dowolnym sposobem)