Secondo questa pagina , l'algoritmo di Dijkstra è solo BFS con una coda prioritaria. è davvero così semplice? Penso di no.
Secondo questa pagina , l'algoritmo di Dijkstra è solo BFS con una coda prioritaria. è davvero così semplice? Penso di no.
Risposte:
Puoi implementare l'algoritmo di Dijkstra come BFS con una coda prioritaria (sebbene non sia l'unica implementazione).
L'algoritmo di Dijkstra si basa sulla proprietà che il percorso più breve da a t sia anche il percorso più breve verso uno qualsiasi dei vertici lungo il percorso. Questo è esattamente ciò che fa BFS.
O in un'altra prospettiva: come si comporterebbe l'algoritmo di Dijkstra se tutti i pesi fossero 1? Esattamente come BFS.
Innanzitutto, come possiamo adattare BFS a un grafico ponderato più generale ?
Ecco un'idea dal libro "Algorithms (Sezione 4.4)" di Dasgupta et al:
Terzo, come si comporta l'algoritmo Dijkstra su grafici non ponderati?
Si comporta esattamente come BFS. Elaboriamo questo da due punti principali.
Sul "rilassamento".
Per l'algoritmo Dijkstra in generale, grafico ponderato, il rilassamento è
for all edges (u,v) in E:
if dist(v) > dist(u) + w(u,v)
dist(v) = dist(u) + w(u,v)
for all edges (u,v) in E:
if dist(v) = \infty
dist(v) = dist(u) + 1
Sulla "coda di priorità".
Quando l'algoritmo Dijkstra viene eseguito su un grafico non ponderato, in qualsiasi momento, la coda di priorità contiene al massimo due valori distinti (distanza). Pertanto, è sufficiente una coda FIFO di BFS.