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
- 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.
- Tant que n'est pas vide ou tant que on répète la procédure suivante :
- 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
- 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