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 00.

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ść 00, a każdy inny wierzchołek ma odległość \infty.

Następnie powtarzamy tę pętlę:

  1. Wybierz nieustalony wierzchołek o najmniejszej tymczasowej odległości.
  2. Sprawdź każdego sąsiada przez ten wierzchołek.
  3. Jeśli nowa trasa jest tańsza, zaktualizuj odległość sąsiada.
  4. 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:

  1. Wybierz wierzchołek startowy.
  2. Ustaw jego odległość na 00, a każdą inną odległość na \infty.
  3. Wybierz nieustalony wierzchołek o najmniejszej tymczasowej odległości.
  4. Wykonaj relaksację jego krawędzi wychodzących.
  5. Oznacz ten wierzchołek jako ustalony.
  6. 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:

  • AB=4A \to B = 4
  • AC=1A \to C = 1
  • CB=2C \to B = 2
  • BD=1B \to D = 1
  • CD=5C \to D = 5

Chcemy znaleźć najkrótszą ścieżkę z AA do DD.

Zaczynamy od:

dist(A)=0,dist(B)=,dist(C)=,dist(D)=\text{dist}(A)=0,\quad \text{dist}(B)=\infty,\quad \text{dist}(C)=\infty,\quad \text{dist}(D)=\infty

Najpierw ustalamy AA i wykonujemy relaksację jego krawędzi:

dist(B)=4,dist(C)=1\text{dist}(B)=4,\quad \text{dist}(C)=1

Najmniejsza nieustalona odległość jest teraz przy CC, więc jako następny ustalamy CC.

Przechodząc przez CC:

  • Przez CC ścieżka do BB ma koszt 1+2=31+2=3, co poprawia wynik 44, więc aktualizujemy dist(B)=3\text{dist}(B)=3.
  • Przez CC ścieżka do DD ma koszt 1+5=61+5=6, więc ustawiamy dist(D)=6\text{dist}(D)=6.

Teraz BB ma najmniejszą nieustaloną odległość, więc ustalamy BB.

Przechodząc przez BB, ścieżka do DD ma koszt:

3+1=43+1=4

To poprawia wynik 66, więc aktualizujemy dist(D)\text{dist}(D) z 66 na 44.

Teraz DD jest nieustalonym wierzchołkiem o najmniejszej odległości. Ustalamy go i kończymy.

Najkrótsza ścieżka to:

ACBDA \to C \to B \to D

o łącznym koszcie:

1+2+1=41+2+1=4

Ten przykład pokazuje kluczowy schemat: trasa, która na początku wyglądała gorzej, ABA \to B, później stała się lepsza dzięki przejściu przez CC. Algorytm Dijkstry na to pozwala, dopóki BB 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ść dd. 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 dd, a potem dodać krawędź o wadze co najmniej 00.

Taka późniejsza trasa nie może więc dać wyniku lepszego niż dd. 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 →