Algorytm Dijkstry pozwala na znalezienie najkrótszych ścieżek z pewnego wierzchołka do wszystkich z niego osiąganych. Jest to przykład algorytmu zachłannego. Wagi grafu muszą być nieujemne.
Algorytm Dijkstry na wejściu wymaga grafu skierowanego lub nieskierowanego o dodatnich wagach krawędzi oraz określenia, który wierzchoek jest początkowy. Na wyjściu algorytm zwróci najkrótszą odległość z punktu początkowego do dowolnego, osiągalnego wierzchołka.
Dla każdego wierzchołka przypisywane są dwie wartości: dystans oraz poprzednik. Początkowo każdy wierzchołek ma dystans nieskończony, a poprzednik jest nieznany. Wyjątkiem jest wierzchołek początkowy dla którego dystans wynosi 0.
Dalszy etap polega na utworzeniu kolejki wszystkich wierzchołków. Nastpnie dopóki kolejka nie jest pusta należy usunąć wierzchołek o najmniejszym kluczu dystansie i zbadać dla niego wszystkie połączone wierzchołki. Jeśli połączenie z wybranego wierzchołka do sąsiada ma łącznie mniejszą wartość niż docelowy wierzchołek to należy zaktualizować dystans oraz sąsiada.
Dany jest następujący graf:
Punktem początkowym jest zaznaczony punkt A. W tabeli została przedstawiona aktualna kolejka oraz właściwości poszczególnych obiektów:
Kolejka | A | B | C | D | E |
---|---|---|---|---|---|
- | 0, - | ∞, - | ∞, - | ∞, - | ∞, - |
A, B, C, D, E | 0, - | 6, A | 3, A | 4, A | 1, A |
E, C, D, B | 0, - | 6, A | 2, E | 4, A | 1, A |
C, D, B | 0, - | 3, C | 2, E | 4, A | 1, A |
B, D | 0, - | 3, C | 2, E | 4, A | 1, A |
D | 0, - | 3, C | 2, E | 4, A | 1, A |
- | 0, - | 3, C | 2, E | 4, A | 1, A |
Na podstawie uzyskanych wyników można zauważyć, że najkrótsza trasa z A do B nie jest bezpośrednia, a przez wierzchołki E i C. Graf najkrótszych ścieżek z wierzchołka A wygląda następująco:
Poniżej zostanie przedstawiony kod implementacji algorytmu Dijkstry oparty o tablicę. Nie jest to rozwiązanie optymalne, ponieważ szukanie minimalnej wartości w pętli jest liniowe O(n) przez co algorytm ostatecznie uzyskuje złożoność kwadratową O(n2). Dla n wierzchołków należy określić macierz n×n, gdzie na pozycji (i, j) znajduje się waga krawędzi łączącej wierzchołki i oraz j.
Oto przykładowy graf i jego reprezentacja macierzowa, którą będzie akceptować funkcja.
Dane dotyczące dystansu do wierzchołka, poprzednika oraz czy został już odwiedzony będą przechowywane w specjalnej strukturze danych.
Do prawidłowego działania programu potrzebna jest funkcja szukajMinimum(), która potrafi znaleźć dla następnej iteracji element, który ma najkrótszy dystans. Jest to substyt kolejki priorytetowej. Wynikiem działania funkcji jest numer wierzchołka, który należy wybrać.
Główna funkcja Dijkstra() wymaga podania dwóch argumentów: macierz czyli zapis informacji o poszczególnych krawędziach oraz start - wierzchołek początkowy.
(2.) Zadeklaruj nową tablicę, a następnie (3. - 7.) wypełnij ją wartościami początkowymi. (8.) Poszukiwanie rozpocznij od wyróżnionego wierzchołka start. Następnie (9.) w pętli: (10.) odznacz, że aktualny u-ty element został odwiedzony i (11. - 16.) odpowiednio zaktualizuj jego sąsiadów. Na koniec (17.) wyszukaj następny wierzchołek o najmniejszym dystansie, który nie został odwiedzony. Na koniec (19.) zwróć wyliczoną tablicę.
Program można przetestować przy pomocy poniższego fragmentu kodu:
Do wyświetlania zawrtych w tablicy służy funkcja wypiszDane() przedstawiona poniżej: