Algorithme de Dijkstra

Maths

In : un graphe orienté pondéré avec des poids positifs et

Out : Une liste de taille contenant les distances minimales séparant de tous les autres nœuds.

Init : Soit et, ( si il n'y a pas d'arête entre et ). (où est le poids de l'arête reliant et ).

Loop : Tant que :

  • un élément de qui minimise
  • (et )


Description

  1. On créé la liste de taille qu'on initialise à 0 pour , pour les nœuds adjacents à et pour les autres nœuds. On créé également l'ensemble qui contient les nœuds dont on connait la distance minimale ainsi que l'ensemble qui contient les nœuds restants.
  2. Tant que n'est pas vide ou tant que on répète la procédure suivante :
  3. On prends l'élément de qui est le plus proche de , on le retire de et on le place dans . Ensuite on regarde pour tous les nœuds restants dans si la valeur de leur distance dans peut être raccourcie en prenant plus le poids associé à l'arête séparant et le nœud en question
  4. contient les valeurs recherchées.

Implémentation Python

def dijkstra(graph, source):
    dist = {vertex: float('infinity') for vertex in graph.vertices}
    dist[source] = 0
    
    Q = set(graph.vertices)
    
    while Q:
        u = float('infinity')
	    for vertex in Q:
		    u = min(u, dist(vertex))
        Q.remove(u)
        
        for v, weight in graph.edges.get(u, {}).items():
            if v in Q:
                alt = dist[u] + weight
                if alt < dist[v]:
                    dist[v] = alt
    
    return dist

Complexité

Implémentation naïve :

Spatiale :

Temporelle :

Meilleure Implémentation

Temporelle : Voir : Tas de Fibonacci


Preuve de validité

Todo