Według tej strony algorytm Dijkstry to po prostu BFS z kolejką priorytetową. Czy to naprawdę takie proste? Myślę, że nie.
algorithms
graphs
shortest-path
Barry Fruitman
źródło
źródło
Odpowiedzi:
Możesz zaimplementować algorytm Dijkstry jako BFS z kolejką priorytetową (choć nie jest to jedyna implementacja).
Algorytm Dijkstry polega na tym, że najkrótsza ścieżka od do jest również najkrótszą ścieżką do dowolnego z wierzchołków wzdłuż ścieżki. Właśnie to robi BFS.ts t
Lub z innej perspektywy: jak zachowałby się algorytm Dijkstry, gdyby wszystkie wagi były równe 1? Dokładnie jak BFS.
źródło
Oto pomysł z książki „Algorytmy (sekcja 4.4)” Dasgupta i in .:
Dla każdej krawędzi z (o masie ) zastąpienie go krawędzi o długości dodając obojętne węzłów pomiędzy i .E l e l e 1 l e - 1 u ve=(u,v) E le le 1 le−1 u v
W rezultacie wszystkie krawędzie wykresu wyników mają długość jednostkową. Dlatego możemy obliczyć odległości w , uruchamiając BFS na . G G ′G′ G G′
BFS na może być naprawdę powolny, jeśli niektóre są duże, ponieważ marnuje zbyt dużo czasu na obliczanie odległości do tych fałszywych węzłów, o których w ogóle nie dbamy. Algorytm Dijkstry unika tego, ustawiając szacunkowe odległości dla węzłów i rozluźniając je w miarę możliwości.l eG′ le
Zachowuje się dokładnie tak samo jak BFS. Opracowujemy to z dwóch głównych punktów.
„Relaks”.
Dla algorytmu Dijkstry na ogólnym wykresie ważonym relaksacja wynosi
W przypadku BFS na nieważonym wykresie wiemy, że i , więc relaksacja jest prostsza:w ( u , v ) = 1dist(v)=∞ w(u,v)=1
W „kolejce priorytetowej”.
Gdy algorytm Dijkstry jest uruchamiany na nieważonym wykresie, kolejka priorytetowa zawiera co najwyżej dwie różne wartości (odległości). Dlatego wystarcza kolejka FIFO BFS.
źródło