Skip to content
Snippets Groups Projects
Verified Commit d483be52 authored by orestis.malaspin's avatar orestis.malaspin
Browse files

added details

parent e0e0ca60
Branches
No related tags found
No related merge requests found
...@@ -380,12 +380,6 @@ pile parcours(précédent, s, t) ...@@ -380,12 +380,6 @@ pile parcours(précédent, s, t)
::: :::
# Algorithme de Dijkstra (exercice)
## Trouver le chemin de `a` à tous lesautres sommets
![L'exercice.](figs/dijkstra_exo.png)
# Algorithme de Dijkstra amélioré # Algorithme de Dijkstra amélioré
## On peut améliorer l'algorithme ## On peut améliorer l'algorithme
...@@ -412,8 +406,9 @@ pile parcours(précédent, s, t) ...@@ -412,8 +406,9 @@ pile parcours(précédent, s, t)
```C ```C
booléen est_vide(élément) // triviale booléen est_vide(élément) // triviale
élément enfiler(élément, data) élément enfiler(élément, data, priorité)
data défiler(élément) data défiler(élément)
rien modifiier_priorité(élément, data, priotié)
nombre priorité(data) // utilitaire nombre priorité(data) // utilitaire
``` ```
...@@ -423,8 +418,9 @@ nombre priorité(data) // utilitaire ...@@ -423,8 +418,9 @@ nombre priorité(data) // utilitaire
```C ```C
struct élément struct élément
data d data
élément next priorité
élément suivant
``` ```
# Les files de priorité # Les files de priorité
...@@ -434,22 +430,22 @@ struct élément ...@@ -434,22 +430,22 @@ struct élément
. . . . . .
```C ```C
élément enfiler(élément e, d) élément enfiler(élément, data, priorité)
élément = créer_élément(d) n_élément = créer_élément(data, priorité)
si est_vide(e) si est_vide(élément)
retourne élément retourne n_élément
si priorité(d) > priorité(e.d) si priorité(d) > priorité(e.d)
élément.next = e n_élément.suivant = élément
retourne e retourne n_élément
sinon sinon
tmp = e tmp = élément
prev = e préc = élément
tant que !est_vide(tmp) && priorité(d) < priorité(tmp.d) tant que !est_vide(tmp) && priorité < tmp.priorité
prev = tmp préc = tmp
tmp = tmp.next tmp = tmp.suivant
prev.next = élément prev.suivant = n_élément
élément.next = tmp n_élément.suivant = tmp
retourne e retourne élément
``` ```
# Les files de priorité # Les files de priorité
...@@ -459,30 +455,99 @@ struct élément ...@@ -459,30 +455,99 @@ struct élément
. . . . . .
```C ```C
data défiler(élément e) data, élément défiler(élément)
si est_vide(e) si est_vide(élément)
retourne AARGL! retourne AARGL!
sinon sinon
retourne e.d tmp = élément.data
n_élément = élément.suivant
libérer(élément)
retourne tmp, n_élément
``` ```
# Algorithme de Dijkstra avec file # Algorithme de Dijkstra avec file
```C
distance, précédent dijkstra(graphe, s, t):
distance[source] = 0
fp = file_p_vide()
pour v dans sommets(graphe)
si v != s
distance[v] = infini
précédent[v] = indéfini
fp = enfiler(fp, v, distance[v])
tant que !est_vide(fp)
u, fp = défiler(fp)
pour v dans voisinage de u
n_distance = distance[u] + w(i, v)
si n_distance < distance[v]
distance[v] = n_distance
précédent[v] = u
fp = changer_priorité(fp, v, n_distance)
retourne distance, précédent
```
# Algorithme de Dijkstra (exercice, 5min)
![L'exercice.](figs/dijkstra_exo.png)
* Donner la liste de priorité, puis...
## A chaque étape donner:
* Le tableau des distances à `a`;
* Le tableau des prédécessueurs;
* L'état de la file de priorité.
# Algorithme de Dijkstra (corrigé)
function Dijkstra(graphe, s, t): ![Le corrigé partie 1.](figs/dijkstra_ex_0.png)
# Algorithme de Dijkstra (corrigé)
![Le corrigé partie 2.](figs/dijkstra_ex_1.png)
# Algorithme de Dijkstra (corrigé)
![Le corrigé partie 3.](figs/dijkstra_ex_2.png)
# Algorithme de Dijkstra (corrigé)
![Le corrigé partie 4.](figs/dijkstra_ex_3.png)
# Algorithme de Dijkstra (corrigé)
![Le corrigé partie 5.](figs/dijkstra_ex_4.png)
# Algorithme de Dijkstra (corrigé)
![Le corrigé partie 6.](figs/dijkstra_ex_5.png)
# Complexité de l'algorithme de Dijkstra?
\footnotesize
. . .
```C
distance, précédent dijkstra(graphe, s, t):
distance[source] = 0 distance[source] = 0
fp = file_p_vide() fp = file_p_vide()
pour chaque v dans sommets(graphe) ----------------------------------------------
pour v dans sommets(graphe)
si v != s si v != s
distance[v] = infinit O(V) distance[v] = infini
fp = enfiler(fq, v) fp = enfiler(fp, v, distance[v])
----------------------------------------------
while Q is not empty: // The main loop tant que !est_vide(fp)
u ← Q.extract_min() // Remove and return best vertex O(V) u, fp = défiler(fp)
for each neighbor v of u: // only v that are still in Q ----------------------------------------------
alt ← dist[u] + Graph.Edges(u, v) pour v dans voisinage de u
if alt < dist[v] O(E) n_distance = distance[u] + w(i, v)
dist[v] ← alt si n_distance < distance[v]
prev[v] ← u distance[v] = n_distance
Q.decrease_priority(v, alt) fp = changer_priorité(fp, v, n_distance)
return dist, prev ----------------------------------------------
----------------------------------------------
retourne distance
```
slides/figs/dijkstra_ex_0.png

51.4 KiB

slides/figs/dijkstra_ex_1.png

51.5 KiB

slides/figs/dijkstra_ex_2.png

51.8 KiB

slides/figs/dijkstra_ex_3.png

51.9 KiB

slides/figs/dijkstra_ex_4.png

51.4 KiB

slides/figs/dijkstra_ex_5.png

51.4 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment