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)