Funkcja znajdz_droge
implementuje algorytm Bellmana-Forda, który jest używany do znalezienia najkrótszej ścieżki w grafie ważonym. Oto szczegółowe wyjaśnienie linijka po linijce:
-
Funkcja
znajdz_droge
przyjmuje dwa argumenty:start
, który jest punktem początkowym, orazadjacency_matrix
, która jest macierzą sąsiedztwa reprezentującą graf. -
Najpierw, funkcja tworzy dwie listy:
dist
ipred
.dist
przechowuje najkrótsze odległości od punktu początkowego do wszystkich innych wierzchołków, apred
przechowuje poprzednik każdego wierzchołka na najkrótszej ścieżce. -
Następnie, funkcja ustawia odległość do punktu początkowego na 0, ponieważ odległość od wierzchołka do samego siebie jest zawsze równa 0.
-
Następnie, funkcja przechodzi przez wszystkie wierzchołki grafu (oprócz punktu początkowego)
n-1
razy. Dla każdego wierzchołkau
, funkcja sprawdza wszystkie jego sąsiadujące wierzchołkiv
. -
Jeżeli odległość do wierzchołka
u
plus waga krawędzi zu
dov
jest mniejsza niż obecna odległość dov
, to funkcja aktualizuje odległość dov
i ustawiau
jako poprzednikav
. -
Po przejściu przez wszystkie wierzchołki
n-1
razy, funkcja zwraca listydist
ipred
.
Algorytm Bellmana-Forda działa poprzez relaksację krawędzi. Relaksacja krawędzi polega na aktualizacji odległości do wierzchołka docelowego, jeżeli znaleziono krótszą ścieżkę. Algorytm wykonuje relaksację dla wszystkich krawędzi n-1
razy, gdzie n
to liczba wierzchołków w grafie. Po n-1
iteracjach, algorytm gwarantuje znalezienie najkrótszej ścieżki do wszystkich wierzchołków (o ile nie ma cykli o ujemnej wadze).