¿El algoritmo de Dijkstra es solo BFS con una cola prioritaria?

22

Según esta página , el algoritmo de Dijkstra es solo BFS con una cola de prioridad. ¿Es realmente así de simple? Yo creo que no.

Barry Fruitman
fuente
1
¿Por qué piensas eso?
Raphael
@Raphael Porque parece demasiado simple, y lo es: lo estudié de nuevo y ahora veo que no hace un seguimiento de la distancia entre los nodos, por lo que es realmente un BFS, no Dijkstra.
Barry Fruitman
1
Bueno, Dijkstra hace cambiar los valores de la cola es "ordenada" con (a menudo llamado "relajación"); si lo prohíbes, no es lo mismo, cierto.
Raphael

Respuestas:

20

Puede implementar el algoritmo de Dijkstra como BFS con una cola prioritaria (aunque no es la única implementación).

El algoritmo de Dijkstra se basa en la propiedad de que la ruta más corta de a t es también la ruta más corta a cualquiera de los vértices a lo largo de la ruta. Esto es exactamente lo que hace BFS.st

O en otra perspectiva: ¿cómo se comportaría el algoritmo de Dijkstra si todos los pesos fueran 1? Exactamente como BFS.

Shaull
fuente
4

Primero, ¿cómo podemos adaptar BFS a un gráfico ponderado más general ?G=(V,E)

Aquí hay una idea del libro "Algoritmos (Sección 4.4)" de Dasgupta et al:

Para cualquier borde de E (con peso l e ), reemplácelo por l e bordes de longitud 1 , agregando l e - 1 nodos ficticios entre u y v .e=(u,v)Elele1le1uv

Como resultado, todos los bordes del gráfico de resultados tienen longitud unitaria. Por lo tanto, podemos calcular distancias en G ejecutando BFS en G ' .GGG

Segundo, ¿cómo el algoritmo de Dijkstra en venció a BFS en el gráfico transformado G ' ?GG

BFS en puede ser muy lento si algunos l e son grandes porque se malgasta demasiado tiempo en las distancias a los nodos de computación ficticias que no importa en absoluto. El algoritmo de Dijkstra lo evita al establecer distancias estimadas para los nodos y relajarlos siempre que sea posible.Gle

Tercero, ¿cómo se comporta el algoritmo Dijkstra en gráficos no ponderados?

Se comporta exactamente igual que BFS. Elaboramos esto desde dos puntos principales.

  • Sobre "relajación".

    Para el algoritmo de Dijkstra en gráfico general ponderado, la relajación es

    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
    
  • En "cola de prioridad".

    Cuando el algoritmo de Dijkstra se ejecuta en un gráfico no ponderado, en cualquier momento, la cola de prioridad contiene como máximo dos valores distintos (distancia). Por lo tanto, una cola FIFO de BFS es suficiente.

hengxina
fuente