Otwórz menu główne

Algorytm Floyda-Warshalla

Algorytm Floyda-Warshalla wykorzystujący metodę programowania dynamicznego algorytm służący do znajdowania najkrótszych ścieżek pomiędzy wszystkimi parami wierzchołków w grafie ważonym[1]. Graf może zawierać gałęzie zarówno o dodatniej i o ujemnej wadze („długości”), lecz nie może zawierać ujemnych cykli (cykli, w których suma wag krawędzi jest ujemna).

Algorytm Floyda-Warshalla
Rodzaj problem najkrótszej ścieżki
Struktura danych graf skierowany
Złożoność
Czasowa
Pamięciowa
Niniejszy artykuł jest częścią cyklu teoria grafów.




Najważniejsze pojęcia
graf
drzewo
podgraf
cykl
klika
stopień wierzchołka
stopień grafu
dopełnienie grafu
obwód grafu
pokrycie wierzchołkowe
liczba chromatyczna
indeks chromatyczny
izomorfizm grafów
homeomorfizm grafów


Wybrane klasy grafów
graf pełny
graf spójny
drzewo
graf dwudzielny
graf regularny
graf eulerowski
graf hamiltonowski
graf planarny


Algorytmy grafowe
A*
Bellmana-Forda
Dijkstry
Fleury'ego
Floyda-Warshalla
Johnsona
Kruskala
Prima
przeszukiwanie grafu
wszerz
w głąb
najbliższego sąsiada


Zagadnienia przedstawiane jako problemy grafowe
problem komiwojażera
problem chińskiego listonosza
problem marszrutyzacji
problem kojarzenia małżeństw


Inne zagadnienia
kod Graya
diagram Hassego
kod Prüfera


Opis algorytmuEdytuj

Algorytm Floyda-Warshalla korzysta z tego, że jeśli najkrótsza ścieżka pomiędzy wierzchołkami   i   prowadzi przez wierzchołek   to jest ona połączeniem najkrótszych ścieżek pomiędzy wierzchołkami   i   oraz   i   Na początku działania algorytmu inicjowana jest tablica długości najkrótszych ścieżek, tak że dla każdej pary wierzchołków   ich odległość wynosi:

 

Algorytm jest dynamiczny i w kolejnych krokach włącza do swoich obliczeń ścieżki przechodzące przez kolejne wierzchołki. Tak więc w  -tym kroku algorytm zajmie się sprawdzaniem dla każdej pary wierzchołków, czy nie da się skrócić (lub utworzyć) ścieżki pomiędzy nimi przechodzącej przez wierzchołek numer   (kolejność wierzchołków jest obojętna, ważne tylko, żeby nie zmieniała się w trakcie działania programu). Po wykonaniu   takich kroków długości najkrótszych ścieżek są już wyliczone.

Wydajność algorytmuEdytuj

  • Złożoność obliczeniowa:  [1]
  • Złożoność pamięciowa:  [2]

Zapis w pseudokodzieEdytuj

Dla grafu   i funkcji wagowej   otrzymamy tablicę   odległości pomiędzy wierzchołkami   i  

Floyd-Warshall(G,w)

dla każdego wierzchołka v1 w V[G] wykonaj
  dla każdego wierzchołka v2 w V[G] wykonaj
    d[v1][v2] = nieskończone
    poprzednik[v1][v2] = niezdefiniowane
  d[v1][v1] = 0
dla każdej krawędzi (v1,v2) w E[G]
  d[v1][v2] = w(v1,v2)
  poprzednik[v1][v2] = v1
dla każdego wierzchołka u w V[G] wykonaj
  dla każdego wierzchołka v1 w V[G] wykonaj
    dla każdego wierzchołka v2 w V[G] wykonaj
      jeżeli d[v1][v2] > d[v1][u] + d[u][v2] to
        d[v1][v2] = d[v1][u] + d[u][v2]
        poprzednik[v1][v2] = poprzednik[u][v2]

Zobacz teżEdytuj

PrzypisyEdytuj

BibliografiaEdytuj

  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Wprowadzenie do algorytmów. WNT, 2007.