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_drogeprzyjmuje 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:
distipred.distprzechowuje najkrótsze odległości od punktu początkowego do wszystkich innych wierzchołków, apredprzechowuje 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-1razy. Dla każdego wierzchołkau, funkcja sprawdza wszystkie jego sąsiadujące wierzchołkiv. -
Jeżeli odległość do wierzchołka
uplus waga krawędzi zudovjest mniejsza niż obecna odległość dov, to funkcja aktualizuje odległość dovi ustawiaujako poprzednikav. -
Po przejściu przez wszystkie wierzchołki
n-1razy, funkcja zwraca listydistipred.
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).