Algorytm Dijkstry wyznacza najkrótsze ścieżki od jednego wierzchołka startowego w grafie ważonym, o ile każda waga krawędzi jest nieujemna. Jeśli interesuje Cię tylko jeden wierzchołek docelowy, możesz zatrzymać się, gdy tylko ten wierzchołek zostanie ustalony.
Podstawowy krok jest zachłanny: zawsze przechodzimy dalej z nieustalonego wierzchołka o najmniejszej znanej odległości. To działa tylko przy założeniu nieujemnych wag.
Co rozwiązuje algorytm Dijkstry
Użyj algorytmu Dijkstry, gdy masz graf z kosztami na krawędziach i chcesz znaleźć najtańszą trasę. Koszt może oznaczać odległość, czas przejazdu, energię albo inną wielkość, którą chcesz zminimalizować.
Działa zarówno dla grafów skierowanych, jak i nieskierowanych. Kluczowy warunek jest jasny: każda waga krawędzi musi być co najmniej równa .
Jak działa algorytm
Każdy wierzchołek przechowuje tymczasową odległość od wierzchołka startowego. Na początku wierzchołek startowy ma odległość , a każdy inny wierzchołek ma odległość .
Następnie powtarzamy tę pętlę:
- Wybierz nieustalony wierzchołek o najmniejszej tymczasowej odległości.
- Sprawdź każdego sąsiada przez ten wierzchołek.
- Jeśli nowa trasa jest tańsza, zaktualizuj odległość sąsiada.
- Oznacz bieżący wierzchołek jako ustalony.
Krok 3 nazywa się relaksacją. Ustalony wierzchołek jest zakończony: jego najkrótsza odległość jest ostateczna, pod warunkiem że graf nie ma krawędzi o ujemnych wagach.
Algorytm Dijkstry krok po kroku
Oto pełna procedura w zwartej postaci:
- Wybierz wierzchołek startowy.
- Ustaw jego odległość na , a każdą inną odległość na .
- Wybierz nieustalony wierzchołek o najmniejszej tymczasowej odległości.
- Wykonaj relaksację jego krawędzi wychodzących.
- Oznacz ten wierzchołek jako ustalony.
- Powtarzaj, aż wszystkie osiągalne wierzchołki zostaną ustalone, albo zatrzymaj się, gdy ustalony zostanie wierzchołek docelowy.
Jeśli dodatkowo zapisujesz, który poprzedni wierzchołek spowodował każdą aktualizację, możesz odtworzyć rzeczywistą ścieżkę, a nie tylko końcową odległość.
Przykład wyznaczania najkrótszej ścieżki
Załóżmy, że graf ma następujące wagi krawędzi:
Chcemy znaleźć najkrótszą ścieżkę z do .
Zaczynamy od:
Najpierw ustalamy i wykonujemy relaksację jego krawędzi:
Najmniejsza nieustalona odległość jest teraz przy , więc jako następny ustalamy .
Przechodząc przez :
- Przez ścieżka do ma koszt , co poprawia wynik , więc aktualizujemy .
- Przez ścieżka do ma koszt , więc ustawiamy .
Teraz ma najmniejszą nieustaloną odległość, więc ustalamy .
Przechodząc przez , ścieżka do ma koszt:
To poprawia wynik , więc aktualizujemy z na .
Teraz jest nieustalonym wierzchołkiem o najmniejszej odległości. Ustalamy go i kończymy.
Najkrótsza ścieżka to:
o łącznym koszcie:
Ten przykład pokazuje kluczowy schemat: trasa, która na początku wyglądała gorzej, , później stała się lepsza dzięki przejściu przez . Algorytm Dijkstry na to pozwala, dopóki pozostaje nieustalony. Gdy wierzchołek zostanie ustalony, jego odległość już się nie zmieni.
Dlaczego nieujemne wagi są ważne
Załóżmy, że obecnie najtańszy nieustalony wierzchołek ma odległość . Każda nowa ścieżka do tego wierzchołka znaleziona później musiałaby wychodzić z innego nieustalonego wierzchołka, którego tymczasowa odległość wynosi co najmniej , a potem dodać krawędź o wadze co najmniej .
Taka późniejsza trasa nie może więc dać wyniku lepszego niż . Dlatego ustalanie najmniejszej tymczasowej odległości jest bezpieczne, gdy wszystkie wagi są nieujemne.
Jeśli istnieje krawędź o ujemnej wadze, ten argument przestaje działać. Ścieżka, która teraz wygląda na drogą, może później stać się tańsza, co oznacza, że zbyt wczesne ustalenie wierzchołka może dać błędną odpowiedź.
Typowe błędy w algorytmie Dijkstry
Używanie go przy ujemnej krawędzi
Nawet jedna ujemna krawędź może zniszczyć logikę zachłanną. Jeśli mogą wystąpić ujemne wagi, użyj innej metody wyznaczania najkrótszej ścieżki.
Traktowanie „widziany” jako „zakończony”
Wierzchołek może już mieć tymczasową odległość i nadal nie być zakończony. Tylko ustalony wierzchołek ma ostateczną najkrótszą odległość.
Zapominanie o tabeli poprzedników
Odległości mówią, jaki jest koszt. Jeśli chcesz też znać samą trasę, zapisuj, który wierzchołek jako ostatni poprawił każdą odległość.
Gdzie używa się algorytmu Dijkstry
Algorytm Dijkstry stosuje się wtedy, gdy problem można zamodelować jako poruszanie się po grafie z nieujemnymi kosztami:
- Planowanie tras na mapach
- Routing sieciowy
- Ruch robota na ważonych siatkach
- Wyznaczanie ścieżek w grach, gdy koszty ruchu są różne
To także standardowy przykład algorytmu zachłannego, którego poprawność zależy od precyzyjnego warunku.
Spróbuj podobnego zadania
Narysuj graf z pięcioma wierzchołkami i dodatnimi wagami krawędzi, a potem wykonaj algorytm Dijkstry ręcznie, używając tabeli odległości. Jeśli chcesz zrobić kolejny krok, spróbuj własnej wersji na nowym grafie i sprawdź dokładnie, w którym momencie każdy wierzchołek staje się bezpieczny do ustalenia.
Potrzebujesz pomocy z zadaniem?
Prześlij pytanie i otrzymaj zweryfikowane rozwiązanie krok po kroku w kilka sekund.
Otwórz GPAI Solver →