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
int
wraz 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 w
Na standardowym wyjściu powinny zostać wypisane, w kolejnych liniach krawędzie
u v w
uż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.