Selon cette page , l'algorithme de Dijkstra est simplement BFS avec une file d'attente prioritaire. Est-ce vraiment aussi simple que cela? Je crois que non.
Selon cette page , l'algorithme de Dijkstra est simplement BFS avec une file d'attente prioritaire. Est-ce vraiment aussi simple que cela? Je crois que non.
Réponses:
Vous pouvez implémenter l'algorithme de Dijkstra en tant que BFS avec une file d'attente prioritaire (bien que ce ne soit pas la seule implémentation).
L'algorithme de Dijkstra repose sur la propriété que le chemin le plus court de à t est également le chemin le plus court vers l'un des sommets le long du chemin. C'est exactement ce que fait BFS.
Ou dans une autre perspective: comment se comporterait l'algorithme de Dijkstra si tous les poids étaient 1? Exactement comme BFS.
Premièrement, comment pouvons-nous adapter BFS à un graphique pondéré plus général ?
Voici une idée tirée du livre «Algorithms (Section 4.4)» de Dasgupta et al:
Troisièmement, comment l'algorithme de Dijkstra se comporte-t-il sur les graphiques non pondérés?
Il se comporte exactement de la même manière que BFS. Nous élaborons cela à partir de deux points principaux.
Sur la "détente".
Pour l'algorithme de Dijkstra sur un graphe général pondéré, la relaxation est
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
Sur "file d'attente prioritaire".
Lorsque l'algorithme de Dijkstra est exécuté sur un graphique non pondéré, à tout moment, la file d'attente prioritaire contient au plus deux valeurs distinctes (distance). Par conséquent, une file d'attente FIFO de BFS suffit.