Algorytm Floyda-Warshalla

Ten artykuł od 2014-06 zawiera treści, przy których brakuje odnośników do źródeł.
Należy dodać przypisy do treści niemających odnośników do źródeł. Dodanie listy źródeł bibliograficznych jest problematyczne, ponieważ nie wiadomo, które treści one uźródławiają.
Sprawdź w źródłach: Encyklopedia PWN • Google Books • Google Scholar • Federacja Bibliotek Cyfrowych • BazHum • BazTech • RCIN • Internet Archive (texts / inlibrary)
Po wyeliminowaniu niedoskonałości należy usunąć szablon {{Dopracować}} z tego artykułu.
Algorytm Floyda-Warshalla
ilustracja
Rodzaj

problem najkrótszej ścieżki

Struktura danych

graf skierowany

Złożoność
Czasowa

O ( | V | 3 ) {\displaystyle O(|V|^{3})}

Pamięciowa

O ( | V | 2 ) {\displaystyle O(|V|^{2})}

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

Opis algorytmu

Algorytm Floyda-Warshalla korzysta z tego, że jeśli najkrótsza ścieżka pomiędzy wierzchołkami v 1 {\displaystyle v_{1}} i v 2 {\displaystyle v_{2}} prowadzi przez wierzchołek u , {\displaystyle u,} to jest ona połączeniem najkrótszych ścieżek pomiędzy wierzchołkami v 1 {\displaystyle v_{1}} i u {\displaystyle u} oraz u {\displaystyle u} i v 2 . {\displaystyle v_{2}.} 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 ( v 1 , v 2 ) {\displaystyle (v_{1},v_{2})} ich odległość wynosi:

d [ v 1 , v 2 ] = { 0 , gdy   v 1 = v 2 w ( v 1 , v 2 ) , gdy   ( v 1 , v 2 ) E + , gdy   ( v 1 , v 2 ) E {\displaystyle d[v_{1},\,v_{2}]={\begin{cases}0,&{\mbox{gdy}}\ v_{1}=v_{2}\\w(v_{1},\,v_{2}),&{\mbox{gdy}}\ (v_{1},\,v_{2})\in E\\+\infty ,&{\mbox{gdy}}\ (v_{1},\,v_{2})\notin E\end{cases}}}

Algorytm jest dynamiczny i w kolejnych krokach włącza do swoich obliczeń ścieżki przechodzące przez kolejne wierzchołki. Tak więc w k {\displaystyle k} -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 k {\displaystyle k} (kolejność wierzchołków jest obojętna, ważne tylko, żeby nie zmieniała się w trakcie działania programu). Po wykonaniu | V | {\displaystyle |V|} takich kroków długości najkrótszych ścieżek są już wyliczone.

Wydajność algorytmu

  • Złożoność obliczeniowa: O ( | V | 3 ) {\displaystyle O(|V|^{3})} [1]
  • Złożoność pamięciowa: O ( | V | 2 ) {\displaystyle O(|V|^{2})} [2]

Zapis w pseudokodzie

Dla grafu G {\displaystyle G} i funkcji wagowej w {\displaystyle w} otrzymamy tablicę d [ v 1 ] [ v 2 ] {\displaystyle d[v_{1}][v_{2}]} odległości pomiędzy wierzchołkami v 1 {\displaystyle v_{1}} i v 2 . {\displaystyle v_{2}.}

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ż

Przypisy

Bibliografia

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