mirror of
https://github.com/Fare-spec/cours.git
synced 2025-12-08 03:00:37 +00:00
75 lines
1.7 KiB
Python
75 lines
1.7 KiB
Python
# https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
|
|
|
|
graph = {
|
|
'A': [('B', 4), ('C', 2)],
|
|
'B': [('C', 5), ('D', 10)],
|
|
'C': [('D', 3), ('E', 8)],
|
|
'D': [('E', 4), ('F', 11)],
|
|
'E': [('G', 6)],
|
|
'F': [('G', 2)],
|
|
'G': []
|
|
}
|
|
|
|
p = {}
|
|
|
|
def chemin(predecesseur, debut, fin):
|
|
chemin = []
|
|
courant = fin
|
|
while courant != debut:
|
|
chemin.insert(0, courant)
|
|
courant = predecesseur.get(courant)
|
|
if courant is None:
|
|
return None
|
|
chemin.insert(0, debut)
|
|
return chemin
|
|
|
|
|
|
def initialisation(G, debut):
|
|
distances = {key: float('inf') for key in G}
|
|
distances[debut] = 0
|
|
return distances
|
|
|
|
|
|
def trouve_min(Q, distances):
|
|
mini = float('inf')
|
|
sommet = None
|
|
for s in Q:
|
|
if distances[s] < mini:
|
|
mini = distances[s]
|
|
sommet = s
|
|
return sommet
|
|
|
|
def poid(s1, s2):
|
|
for voisin, poids in graph[s1]:
|
|
if voisin == s2:
|
|
return poids
|
|
return float('inf')
|
|
|
|
def distances_update(s1, s2, distances, predecesseur):
|
|
poids = poid(s1, s2)
|
|
if distances[s2] > distances[s1] + poids:
|
|
distances[s2] = distances[s1] + poids
|
|
predecesseur[s2] = s1
|
|
|
|
def dijkstra(G, debut='A'):
|
|
distances = initialisation(G, debut)
|
|
predecesseur = {}
|
|
Q = set(G.keys())
|
|
|
|
while Q:
|
|
s1 = trouve_min(Q, distances)
|
|
if s1 is None:
|
|
break
|
|
Q.remove(s1)
|
|
|
|
for voisin, _ in G[s1]:
|
|
if voisin in Q:
|
|
distances_update(s1, voisin, distances, predecesseur)
|
|
|
|
return distances, predecesseur
|
|
|
|
if __name__ == "__main__":
|
|
distances, predecesseur = dijkstra(graph, 'A')
|
|
print("Distances depuis A :", distances)
|
|
print("Chemin le plus court de A à G :", chemin(predecesseur, 'A', 'G'))
|