Algoritmul Johnson

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 7 noiembrie 2019; verificarea necesită 1 editare .

Algoritmul lui Johnson - vă permite să găsiți cele mai scurte căi între toate perechile de vârfuri într-un grafic direcționat ponderat . Acest algoritm funcționează dacă graficul conține muchii cu greutate pozitivă sau negativă, dar nu există cicluri cu greutate negativă. Numit după D. B. Johnson , care a publicat algoritmul în 1977.

Algoritm

Dat un grafic cu o funcție de greutate . Dacă ponderile tuturor muchiilor dintr-un grafic sunt nenegative, puteți găsi cele mai scurte căi între toate perechile de vârfuri rulând algoritmul lui Dijkstra o dată pentru fiecare vârf. Dacă graficul conține muchii cu greutăți negative, dar nu există cicluri cu greutăți negative, se poate calcula un nou set de muchii cu greutăți nenegative, permițând utilizarea metodei anterioare. Noul set constând din greutăți de margine trebuie să îndeplinească următoarele proprietăți.

Păstrarea celor mai scurte căi

Lema (Schimbarea greutăților păstrează cele mai scurte căi). Fie un grafic direcționat ponderat cu o funcție de pondere și  fie o funcție arbitrară care mapează vârfurile la numere reale. Pentru fiecare muchie o definim

Fie  o cale arbitrară de la vârf la vârf . este calea cea mai scurtă cu funcția de greutate dacă și numai dacă este calea cea mai scurtă cu funcția de greutate , adică egalitatea este echivalentă cu egalitatea . În plus, un grafic conține un ciclu cu o pondere negativă folosind o funcție de pondere dacă și numai dacă conține un ciclu cu o pondere negativă folosind o funcție de pondere .

Modificarea greutății

  1. Pentru acest grafic, creați un nou grafic , unde , pentru un vârf nou și .
  2. Să extindem funcția de greutate în așa fel încât egalitatea să fie valabilă pentru toate vârfurile .
  3. În continuare, definim pentru toate nodurile valoarea și noi ponderi pentru toate muchiile .

Procedura de bază

Algoritmul lui Johnson folosește algoritmul Bellman-Ford și algoritmul lui Dijkstra , implementate ca subrutine. Muchiile sunt stocate ca liste de vârfuri adiacente. Algoritmul returnează o matrice obișnuită de dimensiune , unde , sau dă un mesaj că graficul de intrare conține un ciclu cu o pondere negativă.

Algoritmul lui Johnson Construiți un grafic dacă Bellman_Ford = FALSE apoi imprimați „ Graful de intrare conține un ciclu cu o greutate negativă” returnați ø pentru fiecare setați valoarea la , calculate de algoritmul Bellman-Ford pentru fiecare muchie face pentru pentru fiecare vârf , algoritmul lui Dijkstra calculează valori pentru toate vârfurile pentru fiecare vârf nu returnează D

Dificultate

Dacă coada cu prioritate nedescrescătoare din algoritmul lui Dijkstra este implementată ca un heap Fibonacci , atunci timpul de rulare al algoritmului lui Johnson este . Cu o implementare mai simplă a unei cozi cu prioritate nedescrescătoare, timpul de rulare devine egal cu , dar pentru graficele rare, această valoare din limita asimptotică se comportă mai bine decât timpul de rulare al algoritmului Floyd-Warshall .

Vezi și

Link -uri

Literatură