Algorytm Prima znajdujący MST.

Algorytm Prima to kolejny algorytm znajdujący minimalne drzewo spinajace (=MST).

Opis algorytmu Prima:

Implementacja algorytmu Prima: Zadanie 29

Zaprogramuj algorytm Prima używając "prymitywnej" kolejki priorytetowej.
W kolejce takiej, aby znaleźć element minimalny przegląda się wszystkie elementy.
Zbadaj działanie algorytmu na nastepującym grafie: Oszacuj czas działania algorytmu jako funkcję "n" (liczby wierzchołków) oraz ewentualnie "m" (liczby krawędzi); odpowiedź uzasadnij.
 

Zadanie 30


Zaprogramuj algorytm Prima używając kolejki priorytetowej z "drzew BST" lub "kopców".
Zbadaj poprawność na przykładzie z poprzedniego zadania.
Uzasadnij dlaczego algorytmu Prima z kopcową kolejką priorytetową działa w czasie O(m log n), gdzie "m" oznacza liczbę kraw a "n" liczbę wierz grafu.

Wskazówki do kolejki priorytetowej z drzewa BST:
.......................................

Wskazówki do kopcowej kolejki priorytetowej:
Każdy wierzchołek grafu jest powiązany z elementem kolejki priorytetowej i odwrotnie. Pamiętajmy jednak że elementy kolejki się przesuwają !!!.

Kolejka priorytetowa wymaga dodatkowej procedury:

     void HeapPri_ChangeKey(A,i,klucz);
zmieniającej klucz i-tego elementu tablicy A, a następnie naprawiającej własność kopca.
W kopcowej kol. prior. dysponujemy procedurą:
     void HeapPri_ExtractMax(A, &Elem);
podczas gdy w algorytmie Prima potrzebujemy HeapPri_ExtractMin() - wystarczy zmieniać znak klucza.
 

Zadanie 31(*)


Porównaj efektywność algorytmów z zadań 29 i 30 na dużym grafie losowym.
W grafie losowym krawędź miedzy wierzchołkami "v" i "u" istnieje z zadanym prawdopodobieństwem "p" (ten graf musi być spójny ! - można to osiągnąć tworząc na początku ścieżkę zawierającą wszystkie wierzchołki a potem dodając "losowe" krawędzie).
Jako operacje dominującą przyjmujemy "odczytanie wagi krawędzi" (zarówno w grafie jak i w kolejce priorytetowej).