1 : |4,3,2,1, | , , , , | , , , , | 2 : |4,3,2, , | 1, , , , | , , , , | 3 : |4,3, , , | 1, , , , | 2, , , , | 4 : |4,3, , , | , , , , | 2,1, , , | 5 : |4, , , , | 3, , , , | 2,1, , , | 6 : |4,1, , , | 3, , , , | 2, , , , | 7 : |4,1, , , | 3,2, , , | , , , , | 8 : |4, , , , | 3,2,1, , | , , , , | 9 : | , , , , | 3,2,1, , | 4, , , , | 10 : | , , , , | 3,2, , , | 4,1, , , | 11 : |2, , , , | 3, , , , | 4,1, , , | 12 : |2,1, , , | 3, , , , | 4, , , , | 13 : |2,1, , , | , , , , | 4,3, , , | 14 : |2, , , , | 1, , , , | 4,3, , , | 15 : | , , , , | 1, , , , | 4,3,2, , | 16 : | , , , , | , , , , | 4,3,2,1, |Uruchom procedurę dla 5 krążków i rezultat wstaw do sprawozdania.
Zadanie 18 (?)
(Poniżej przedstawiam przy pomocy rysunków niezbędne pojęcia ...)
Co to jest graf ?
Ten rysunek pokazuje przykładowy graf:
Co to jest drzewo ?
Jest to graf który nie zawiera cykli; poniższy rysunek pokazuje przykładowe
drzewo:
Zauważmy że pojedynczy wierzchołek też jest drzewem.
Zbiór rozłącznych drzew nazywamy lasem.
Co to jest drzewo spinające ?
Jest to drzewo zawarte w grafie, zawierające wszystkie jego wierzchołki;
poniższy rysunek pokazuje przykładowe drzewo spinające:
Szkic algorytmu Kruskala:
Każde drzewo lasu jest reprezentowane przez zbiór wierzchołków (zbiory te są rozłączne).
void UtworzZbior(int a)
{
// 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 odpowiedniej macierzy.
Jeśli jest to graf na N-wierzchołkach
void DodajKrawedz(int v, int u, float Waga)
{
// dodaje krawędź między wierzchołkami "v" i "u"
// z wagą równą "Waga"
// (wagi można przechowywać w osobnej macierzy ...)
}
void PokazGraf() // tylko do celow testowych
{
}
Należy wypróbować "algorytm Kruskala" 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();
PokazDrzewoOrazJegoWage();
*/
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();
PokazDrzewoOrazJegoWage();
}