W pliku test-graph.txt znajduje się podstawowy graf do testów zadań 2 i 3.
Napisz program, który symuluje działanie kolejki priorytetowej. Struktura powinna umożliwiać przechowywanie wartości typu
intwraz z ich priorytetem, będącym nieujemną liczbą całkowitą przy czym najwyższym priorytetem jest wartość . Program nie powinien wymagać żadnych parametrów uruchomienia, a na standardowym wejściu przyjmuje dodatnią liczbę całkowitą (liczba operacji), a następnie (w liniach –) jedną z operacji:
insert- wstaw do struktury wartość o priorytecieempty- wypisz wartość dla pustej struktury, wartość w p.p.top- wypisz wartość o najwyższym priorytecie lub pustą linię w przypadku braku elementów w strukturzepop- wypisz wartość o najwyższym priorytecie a następnie usuń ją ze struktury (wypisz pustą linię w przypadku braku elementów w strukturze)priority- dla każdego elementu o wartości obecnego w strukturze ustawia priorytet jeśli jest on wyższy od aktualnego priorytetu danego elementuDla liczby elementów w kolejce , koszt operacji musi wynosić , dla wszystkich poleceń z pominięciem
Aby uruchomić program należy wykonać ./priority_queue.py.
Korzystając ze struktury zaimplementowanej w zadaniu 1 lub kopca Fibonacciego, zaimplementuj program realizujący algorytm Dijkstry, dla podanego grafu skierowanego , znajdujący najkrótsze ścieżki z wybranego wierzchołka do każdego .
Program nie powinien wymagać żadnych parametrów uruchomienia. Po uruchomieniu programu, na standardowym wejściu, podajemy definicję grafu oraz wierzchołek startowy . Kolejno wczytywane są:
- liczba wierzchołków (przyjmijmy, że wierzchołki są etykietowane kolejnymi liczbami naturalnymi )
- liczba krawędzi (krawędzie są postaci , gdzie to źródło krawędzi, jest wierzchołkiem docelowym a wagą krawędzi – zakładamy, że wagi są nieujemnymi liczbami rzeczywistymi, ale niekoniecznie spełniona jest nierówność trójkąta, ponadto przyjmujemy iż ścieżka z do zawsze istnieje i ma koszt )
- kolejno definicji krawędzi w postaci
u v w- etykieta wierzchołka startowego
Na standardowym wyjściu powinno zostać linii, w formacie
id_celu waga_drogi, natomiast na standardowym wyjściu błędów powinny być wypisane dokładne ścieżki (tzn. wierzchołki pośrednie i wagi) do każdego z wierzchołków docelowych oraz czas działania programu w milisekundach.
Aby uruchomić program należy wykonać ./dijkstra.py <test-graph.txt dla przykładowego grafu.
Korzystając ze struktury z zadania 1 zaimplementuj algorytmy znajdujące dla podanego grafu nieskierowanego minimalne drzewa rozpinające.
Program powinien umożliwiać wykonanie algorytmu Prima (parametr uruchomienia
-p) oraz algorytmu Kruskala (parametr uruchomienia-k). Niezależnie od parametru uruchomienia, dane wejściowe przyjmują postać:
- liczba wierzchołków (przyjmujemy, że wierzchołki są etykietowane kolejnymi liczbami naturalnymi )
- liczba krawędzi (krawędzie są postaci , gdzie to źródło krawędzi, jest wierzchołkiem docelowym a wagą krawędzi – zakładamy, że wagi są nieujemnymi liczbami rzeczywistymi, ale niekoniecznie spełniona jest nierówność trójkąta, ponadto przyjmujemy iż ścieżka z do zawsze istnieje i ma koszt oraz , ponadto przyjmujemy, że graf jest spójny)
- kolejno definicji krawędzi w postaci
u v wNa standardowym wyjściu powinny zostać wypisane, w kolejnych liniach krawędzie
u v wużyte w drzewie rozpinającym (przyjmujemy, że ) oraz łączną wagę drzewa rozpinającego.
Aby uruchomić program należy wykonać ./msts.py <test-graph.txt dla przykładowego grafu.