Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 2

Szymon Itrich

Nr. Indeksu 125593


Gr. 02 Informatyka

Algorytm Dijkstry znajduje w grafie wszystkie najkrótsze ścieżki pomiędzy


wybranym wierzchołkiem a wszystkimi pozostałymi wierzchołkami. Tworząc przy
tym graf. Krawędziom między wierzchołkami dodatkowo przypisujemy wagi.
Dzięki temu wyliczamy również koszt przejścia ścieżek między wierzchołkami.
Używając algorytmu Dijkstry znajdujemy najkrótsze ścieżki w grafie.

Użytkownik na początku wpisuje numer wierzchołka początkowego, następnie


podaje liczbę krawędzi, jaką posiada graf. Kolejnym krokiem jest wczytanie od
użytkownika numerów dwóch wierzchołków oraz podania wagi ścieżki między
nimi, kosztu przejścia od jednego wierzchołka do drugiego. Program wykona
kopiec, a następnie wpisze.

Do programu mogą być wczytywane tylko liczby dodatnie. Największa możliwa


wartość sumy wag między krawędziami może wynosić 2147483647, ponieważ
jest to największa wartość dla procesora 32-bitowego. Maxymalna liczba
krawędzi to 100.

Przykładowe dane:

1
9
1 2 3
1 4 3
2 3 2
3 1 6
3 6 1
4 5 1
5 3 1
5 6 2
6 4 3

Program inicjuje struktury danych, nastepnie odczytuje dane wejsciowe:


Wczytuję numer wierzchołka początkowego – 1,
Wczytuję liczbę krawędzi – 9,

- opis programu (interfejs użytkownika, format danych wejściowych, opis


ewentualnych dodatkowych danych np. pozycje węzłów na ekranie itp.)
- identyfikację przypadków szczególnych (jeżeli występują w algorytmie)
- przedstawienie działania algorytmu dla przykładowych danych (ok. 1-2 strony;
dane powinny być tak dobrane, aby jak najlepiej przedstawić działanie algorytmu,
występujące w nim przypadki itp.)

Aby efektywnie zaimplementować algorytm Dijkstry, musimy najpierw rozwiązać kilka


problemów.
Szymon Itrich
Nr. Indeksu 125593
Gr. 02 Informatyka

Pierwszym z nich jest sposób reprezentacji grafu w pamięci komputera. Ponieważ algorytm
często będzie odwoływał się do wierzchołków sąsiadujących z wierzchołkiem przetwarzanym
(tzn. połączonych z nim krawędzią), to reprezentacja grafu powinna efektywnie umożliwiać
szybkie wyszukiwanie sąsiadów. Wydaje się, iż warunek ten spełniają listy sąsiedztwa.

Drugim problemem jest sposób reprezentacji zbiorów S i Q. Zbiory te są ze sobą powiązane


logicznie. Jeśli wierzchołek jest w zbiorze Q, to oczywiście nie ma go w zbiorze S i na
odwrót. Utworzymy zatem dodatkową tablicę logiczną SQ[ ] o n-elementach. Indeks będzie
określał wierzchołek grafu, natomiast zawartość false będzie oznaczała, iż wierzchołek ten
jest w Q, a zawartość true, iż jest w S.

Następny problem, to sprawdzanie czy zbiór Q jest pusty w warunku kontynuacji pętli. Zwróć
uwagę, iż przy każdym przebiegu tej pętli dokładnie jeden wierzchołek jest przenoszony z Q
do S (zmienia swój stan w QS[ ] z false na true). Zatem po n-tym przebiegu wszystkie
wierzchołki automatycznie znajdą się w zbiorze S. Nie musimy sprawdzać Q - wystarczy, iż
pętlę tą zrealizujemy jako pętlę iteracyjną o n przebiegach.

Kolejnym problemem wpływającym na efektywność algorytmu jest wyszukiwanie w zbiorze


Q wierzchołka o najmniejszej wartości kosztu dojścia d. Możemy tutaj zastosować proste
wyszukiwanie liniowe - wtedy cały algorytm będzie miał czasową złożoność obliczeniową
klasy O(n2). Jednakże dużo lepszym pomysłem (ale trudniejszym w realizacji) jest
zastosowanie kolejki priorytetowej opartej na strukturze kopca. Tematem tym zajmiemy się w
następnym module.

You might also like