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.
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.
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 .
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ă DDacă 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 .
Algoritmi de căutare grafică | ||
---|---|---|
Metode neinformate | ||
Metode informate | ||
Comenzi rapide | ||
Arborele de întindere minim | ||
Alte |