L'algorithme de Dijkstra est-il uniquement BFS avec une file d'attente prioritaire?

22

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.

Barry Fruitman
la source
1
Pourquoi pensez-vous cela?
Raphael
@Raphael Parce que cela semble trop simple, et il l'est: je l'ai étudié à nouveau et je vois maintenant qu'il ne garde pas la distance entre les nœuds, donc c'est vraiment un BFS, pas Dijkstra.
Barry Fruitman le
1
Eh bien, Dijkstra fait modifier les valeurs de la file d' attente est « sorted » avec (souvent appelé « relaxation »); si vous l'interdisez, ce n'est pas pareil, c'est vrai.
Raphael

Réponses:

20

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.st

Ou dans une autre perspective: comment se comporterait l'algorithme de Dijkstra si tous les poids étaient 1? Exactement comme BFS.

Shaull
la source
4

Premièrement, comment pouvons-nous adapter BFS à un graphique pondéré plus général ?G=(V,E)

Voici une idée tirée du livre «Algorithms (Section 4.4)» de Dasgupta et al:

e=(u,v)Elele1le1uv

GGG

GG

Gle

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)
    

    dist(v)=w(u,v)=1

    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.

hengxin
la source