1
CSI2510
Structures de données et
algorithmes
Plus court chemin
1
Graphe pondéré
Les poids des arêtes d’un graphe représentent des
distances, des coûts, etc.
Exemple d’un graphe pondéré non-orienté:
Dans un graphe des route aériennes, le poids d'une
arête représente la distance en miles entre les
aéroports de chaque extrémité
ORD
PVD
MIA
DFW
SFO
LAX
LGA
HNL
2
CSI2510 -- PCC
Plus court chemin
Étant donné un graphe pondéré et deux sommets u
et v, nous voulons trouver un chemin de poids total
minimal entre u et v
Applications
 Les réservations de vol
 Directions de conduite
 Routage des paquets d‘Internet
Exemple:
 Plus court chemin entre Providence et Honolulu
ORD
PVD
MIA
DFW
SFO
LAX
LGA
HNL
3
CSI2510 -- PCC
Propriétés
Propriété 1:
Un sous-chemin d’un plus court chemin est aussi un plus court
chemin
Propriété 2:
L’ensemble des plus courts chemins d’un sommet à tous les
autres sommets forme un arbre
Exemple:
Un arbre des plus courts chemins de Providence
ORD
PVD
MIA
DFW
SFO
LAX
LGA
HNL
4
CSI2510 -- PCC
Algorithme de Dijkstra
La distance entre un sommet v à un autre sommet
s est la longueur du plus court chemin entre s et v
L’algorithme de Dijkstra calcule la distance entre
un sommet donnée s de départ et tous les autres
sommets
Suppositions:
 Le graphe est connexe
 Les arêtes sont non-orientées
 Les poids des arêtes sont non-négatifs
5
CSI2510 -- PCC
L’algorithme conserve l’ensemble des sommets pour lesquels la
distance a été calculée, appelé nuage (cloud) C
On fait grossir un “nuage” de sommets, contenant au départ s et
couvrant éventuellement tous les sommets
Pour chaque sommet v nous emmagasinons d(v) = La plus courte
distance entre v et s dans le sous-graphe constitué du nuage et de ses
sommets adjacents.
Exemple
CSI2510 -- PCC
Algorithme de Dijkstra
6
C
B
A
E
D
F
0
4
2
8
 
4
8
7 1
2 5
2
3 9
Pour chaque étape:
Nous ajoutons au nuage le sommet extérieur u qui
a la plus petite étiquette de distance
Nous mettons à jour les étiquettes des sommets
adjacents à u
Dans l’exemple …
C
B
A
E
D
F
0
4
8
7 1
2 5
2
3 9
4
2
8
 
5 - chemin plus court!
8
C
B
A
E
D
F
0
8
4
8
7 1
2 5
2
3 9
4
2


7
CSI2510 -- PCC
Algorithme de Dijkstra
11 - chemin plus court!
3 --> chemin
plus court!
Mise à jour = la relaxation des arêtes
Considérer une arête
e = (u,z) telle que:
 u est le sommet le plus
récemment ajouté au nuage
 z n’est pas dans le nuage
La relaxation d’une arête e
consiste a mettre à jour la
distance d(z) comme suit:
d(z) = 75
d(u) = 50
z
s
u
d(z) = 60
d(u) = 50
z
s
u
d(z)  min( d(z), d(u) + poids(e) )
8
CSI2510 -- PCC
Algorithme de Dijkstra
Exemple
C
B
A
E
D
F
0
4
2
8
 
4
8
7 1
2 5
2
3 9
C
B
A
E
D
F
0
3
2
8
5 11
4
8
7 1
2 5
2
3 9
C
B
A
E
D
F
0
3
2
8
5 8
4
8
7 1
2 5
2
3 9
C
B
A
E
D
F
0
3
2
7
5 8
4
8
7 1
2 5
2
3 9
9
CSI2510 -- PCC
Exemple (suite)
C
B
A
E
D
F
0
3
2
7
5 8
4
8
7 1
2 5
2
3 9
C
B
A
E
D
F
0
3
2
7
5 8
4
8
7 1
2 5
2
3 9
10
CSI2510 -- PCC
Algorithme de Dijkstra
Nous emmagasinons les sommets, qui ne sont
pas dans le nuage, dans une file de priorité Q.
élément: un sommet v
clé: D[v] la distance du sommet
11
CSI2510 -- PCC
Algorithm ShortestPath(G, v):
Entrés : Un graphe pondéré G et un sommet particulier v de G.
Sortie : Une étiquette D[u], pour chaque sommet u de G, telle que
D[u] est la longueur d'un plus court chemin de v à u dans G.
initialise D[v]  0 et D[u]  ∞ pour chaque sommet v  u
Soit Q une file à priorité qui contient tous les sommets de G
utilisant les étiquettes de D comme clés.
while Q   do {insérer u dans le nuage C}
u  Q.removeMinElement()
pour chaque sommet z adjacent à u tel que z est dans Q faire
{exécuter l'opération de relaxation sur l’arête (u, z) }
Si D[u] + w((u, z)) < D[z] alors
D[z] D[u] + w((u, z))
changer la valeur de la clé de z dans Q à D[z]
Retourner l’étiquette D[u] de chaque sommet u.
12
CSI2510 -- PCC
Algorithme de Dijkstra
Même exemple, avec un tas
C
B
A
E
D
F
0
4
2
8
 
4
8
7 1
2 5
2
3 9
(A,C) 2
(A,D) 4
(A,B) 8
A B C D E F
0 8 2 4  
D
C
B
A
E
D
F
0
3
2
8
5 11
4
8
7 1
2 5
2
3 9
RemoveMin()
et mise-a-jour
13
CSI2510 -- PCC
C
B
A
E
D
F
0
3
2
8
5 11
4
8
7 1
2 5
2
3 9
(A,B) 8
RemoveMin()
(A,D) 4
Relaxation:
Mise-a-jour: (C,D) 3
(C,F) 11
(C,E) 5
(C,B) 9 NON (9>8)
YES (3 < 4)
YES (5 < )
YES (11 < )
D
A B C D E F
0 8 2 4  
14
CSI2510 -- PCC
(C,D) 3
(C,F) 11
(C,E) 5
(A,B) 8
(A,D) 4
D
A B C D E F
0 8 2 4  
au lieu de 4
au lieu de 
au lieu de 
Remplacer (A,D) 4 avec (C,D) 3
Insert (C,E) 5
Insert (C,F) 11
15
CSI2510 -- PCC
Mise à jour signifie: enlever les anciennes clés
et remplacer par les nouvelles
(C,D) 3
(C,F) 11
(C,E) 5
(A,B) 8
D
A B C D E F
0 8 2 3  
au lieu de 4
au lieu de 
au lieu de 
Remplacer (A,D) 4 avec (C,D) 3
Insert (C,E) 5
Insert (C,F) 11
(C,D) 3
Quand on doit remplacer, il faut
aussi réarranger le heap
(pas montré dans cet exemple)
Mise à jour signifie: enlever les anciennes clés
et remplacer par les nouvelles
16
CSI2510 -- PCC
(C,D) 3
(C,F) 11
(C,E) 5
(A,B) 8
D
A B C D E F
0 8 2 3 5 
au lieu de 4
au lieu de 
au lieu de 
Remplacer (A,D) 4 avec (C,D) 3
Insert (C,E) 5
Insert (C,F) 11
(C,D) 3
(C,E) 5
17
CSI2510 -- PCC
Mise à jour signifie: enlever les anciennes clés
et remplacer par les nouvelles
(C,D) 3
(C,F) 11
(C,E) 5
(A,B) 8
D
A B C D E F
0 8 2 3 5 11
Instead of 4
Instead of 
Instead of 
Remplacer (A,D) 4 avec (C,D) 3
Insert (C,E) 5
Insert (C,F) 11
(C,D) 3
(C,E) 5
(C,F) 11
18
CSI2510 -- PCC
Mise à jour signifie: enlever les anciennes clés
et remplacer par les nouvelles
(A,B) 8
D
A B C D E F
0 8 2 3 5 11
(C,D) 3
(C,E) 5
(C,F) 11
C
B
A
E
D
F
0
3
2
8
5 8
4
8
7 1
2 5
2
3 9
RemoveMin()
Mis-a-jour
19
CSI2510 -- PCC
(A,B) 8
D
A B C D E F
0 8 2 3 5 11
(C,E) 5
(C,F) 11
C
B
A
E
D
F
0
3
2
8
5 8
4
8
7 1
2 5
2
3 9
RemoveMin()
Mise à jour (D,F) 8 ? Yes 8 < 11
Remplacer (C,F) 11
avec (D,F) 8
20
CSI2510 -- PCC
(A,B) 8
D
A B C D E F
0 8 2 3 5 8
(C,E) 5
(D,F) 8
C
B
A
E
D
F
0
3
2
8
5 8
4
8
7 1
2 5
2
3 9
RemoveMin()
Mise à jour (D,F) 8 ? Yes 8 < 11
Remplacer (C,F) 11
avec (D,F) 8
21
CSI2510 -- PCC
Pourquoi l‘algorithme de Dijkstra fonctionne?
L’algorithme de Dijkstra utilise un algorithme glouton.
C’est-à-dire un algorithme qui effectue à chaque étape
le choix optimal local dans l’espoir d’arriver à la
solution optimale globale.
C
B
A
E
D
F
0
3
2
7
5 8
4
8
7 1
2 5
2
3 9
 Supposons qu'il n'a pas trouvé toutes les
plus courtes distances. Soit F le premier
mauvais sommet que l'algorithme a traité.
 Quand le nœud précédent, D, sur le vrai
plus court chemin a été considéré, sa
distance était correcte.
 Mais l’arête (D,F) a été relaxée à ce
moment-là!
 Ainsi, aussi longtemps que d(F)>d(D) la
distance de F ne peut pas être fausse.
C'est-à-dire, il n'y a pas de mauvais
sommet.
22
CSI2510 -- PCC
Le temps d’exécution
Si nous représentons G avec une liste d’adjacence, alors nous pouvons parcourir tous les
sommets adjacents à u pendant un temps proportionnel à deg(u)
La file de priorité Q
Avec heap.
while Q   do {insérer u dans le nuage C}
A chaque itération:
- Extraction des sommets avec la distance la plus petite: O(log n).
- Mises à jour des clés: O(log n) pour chaque mise à jour (remplacer une clé et insérer
dans le monceau)=>Apres chaque extraction (deg(u) mises à jour): O(deg(u) log n)
En total: uG (1 + deg(u)) log n = O((n+2m) log n) = O(m*log n)
Meilleur cas: O(n log n)
Pire cas: O(n2 log n)
23
CSI2510 -- PCC
Avec une séquence non-triée:
O(n) quand on extrait les éléments minimaux
mais des mises à jour des clés plus rapides en O(1).
Il y a n-1 extractions d’ordre n et m mises à jour
d’ordre constant.
Le temps d’exécution est O(n2+m) = O(n2 )
O(m log n) O(n2 )
Monceau Séquence
En conclusion:
24
CSI2510 -- PCC
Le temps d’exécution

Algorithme du Plus Court Chemin presentation

  • 1.
    1 CSI2510 Structures de donnéeset algorithmes Plus court chemin 1
  • 2.
    Graphe pondéré Les poidsdes arêtes d’un graphe représentent des distances, des coûts, etc. Exemple d’un graphe pondéré non-orienté: Dans un graphe des route aériennes, le poids d'une arête représente la distance en miles entre les aéroports de chaque extrémité ORD PVD MIA DFW SFO LAX LGA HNL 2 CSI2510 -- PCC
  • 3.
    Plus court chemin Étantdonné un graphe pondéré et deux sommets u et v, nous voulons trouver un chemin de poids total minimal entre u et v Applications  Les réservations de vol  Directions de conduite  Routage des paquets d‘Internet Exemple:  Plus court chemin entre Providence et Honolulu ORD PVD MIA DFW SFO LAX LGA HNL 3 CSI2510 -- PCC
  • 4.
    Propriétés Propriété 1: Un sous-chemind’un plus court chemin est aussi un plus court chemin Propriété 2: L’ensemble des plus courts chemins d’un sommet à tous les autres sommets forme un arbre Exemple: Un arbre des plus courts chemins de Providence ORD PVD MIA DFW SFO LAX LGA HNL 4 CSI2510 -- PCC
  • 5.
    Algorithme de Dijkstra Ladistance entre un sommet v à un autre sommet s est la longueur du plus court chemin entre s et v L’algorithme de Dijkstra calcule la distance entre un sommet donnée s de départ et tous les autres sommets Suppositions:  Le graphe est connexe  Les arêtes sont non-orientées  Les poids des arêtes sont non-négatifs 5 CSI2510 -- PCC
  • 6.
    L’algorithme conserve l’ensembledes sommets pour lesquels la distance a été calculée, appelé nuage (cloud) C On fait grossir un “nuage” de sommets, contenant au départ s et couvrant éventuellement tous les sommets Pour chaque sommet v nous emmagasinons d(v) = La plus courte distance entre v et s dans le sous-graphe constitué du nuage et de ses sommets adjacents. Exemple CSI2510 -- PCC Algorithme de Dijkstra 6 C B A E D F 0 4 2 8   4 8 7 1 2 5 2 3 9
  • 7.
    Pour chaque étape: Nousajoutons au nuage le sommet extérieur u qui a la plus petite étiquette de distance Nous mettons à jour les étiquettes des sommets adjacents à u Dans l’exemple … C B A E D F 0 4 8 7 1 2 5 2 3 9 4 2 8   5 - chemin plus court! 8 C B A E D F 0 8 4 8 7 1 2 5 2 3 9 4 2   7 CSI2510 -- PCC Algorithme de Dijkstra 11 - chemin plus court! 3 --> chemin plus court!
  • 8.
    Mise à jour= la relaxation des arêtes Considérer une arête e = (u,z) telle que:  u est le sommet le plus récemment ajouté au nuage  z n’est pas dans le nuage La relaxation d’une arête e consiste a mettre à jour la distance d(z) comme suit: d(z) = 75 d(u) = 50 z s u d(z) = 60 d(u) = 50 z s u d(z)  min( d(z), d(u) + poids(e) ) 8 CSI2510 -- PCC Algorithme de Dijkstra
  • 9.
    Exemple C B A E D F 0 4 2 8   4 8 7 1 25 2 3 9 C B A E D F 0 3 2 8 5 11 4 8 7 1 2 5 2 3 9 C B A E D F 0 3 2 8 5 8 4 8 7 1 2 5 2 3 9 C B A E D F 0 3 2 7 5 8 4 8 7 1 2 5 2 3 9 9 CSI2510 -- PCC
  • 10.
    Exemple (suite) C B A E D F 0 3 2 7 5 8 4 8 71 2 5 2 3 9 C B A E D F 0 3 2 7 5 8 4 8 7 1 2 5 2 3 9 10 CSI2510 -- PCC
  • 11.
    Algorithme de Dijkstra Nousemmagasinons les sommets, qui ne sont pas dans le nuage, dans une file de priorité Q. élément: un sommet v clé: D[v] la distance du sommet 11 CSI2510 -- PCC
  • 12.
    Algorithm ShortestPath(G, v): Entrés: Un graphe pondéré G et un sommet particulier v de G. Sortie : Une étiquette D[u], pour chaque sommet u de G, telle que D[u] est la longueur d'un plus court chemin de v à u dans G. initialise D[v]  0 et D[u]  ∞ pour chaque sommet v  u Soit Q une file à priorité qui contient tous les sommets de G utilisant les étiquettes de D comme clés. while Q   do {insérer u dans le nuage C} u  Q.removeMinElement() pour chaque sommet z adjacent à u tel que z est dans Q faire {exécuter l'opération de relaxation sur l’arête (u, z) } Si D[u] + w((u, z)) < D[z] alors D[z] D[u] + w((u, z)) changer la valeur de la clé de z dans Q à D[z] Retourner l’étiquette D[u] de chaque sommet u. 12 CSI2510 -- PCC Algorithme de Dijkstra
  • 13.
    Même exemple, avecun tas C B A E D F 0 4 2 8   4 8 7 1 2 5 2 3 9 (A,C) 2 (A,D) 4 (A,B) 8 A B C D E F 0 8 2 4   D C B A E D F 0 3 2 8 5 11 4 8 7 1 2 5 2 3 9 RemoveMin() et mise-a-jour 13 CSI2510 -- PCC
  • 14.
    C B A E D F 0 3 2 8 5 11 4 8 7 1 25 2 3 9 (A,B) 8 RemoveMin() (A,D) 4 Relaxation: Mise-a-jour: (C,D) 3 (C,F) 11 (C,E) 5 (C,B) 9 NON (9>8) YES (3 < 4) YES (5 < ) YES (11 < ) D A B C D E F 0 8 2 4   14 CSI2510 -- PCC
  • 15.
    (C,D) 3 (C,F) 11 (C,E)5 (A,B) 8 (A,D) 4 D A B C D E F 0 8 2 4   au lieu de 4 au lieu de  au lieu de  Remplacer (A,D) 4 avec (C,D) 3 Insert (C,E) 5 Insert (C,F) 11 15 CSI2510 -- PCC Mise à jour signifie: enlever les anciennes clés et remplacer par les nouvelles
  • 16.
    (C,D) 3 (C,F) 11 (C,E)5 (A,B) 8 D A B C D E F 0 8 2 3   au lieu de 4 au lieu de  au lieu de  Remplacer (A,D) 4 avec (C,D) 3 Insert (C,E) 5 Insert (C,F) 11 (C,D) 3 Quand on doit remplacer, il faut aussi réarranger le heap (pas montré dans cet exemple) Mise à jour signifie: enlever les anciennes clés et remplacer par les nouvelles 16 CSI2510 -- PCC
  • 17.
    (C,D) 3 (C,F) 11 (C,E)5 (A,B) 8 D A B C D E F 0 8 2 3 5  au lieu de 4 au lieu de  au lieu de  Remplacer (A,D) 4 avec (C,D) 3 Insert (C,E) 5 Insert (C,F) 11 (C,D) 3 (C,E) 5 17 CSI2510 -- PCC Mise à jour signifie: enlever les anciennes clés et remplacer par les nouvelles
  • 18.
    (C,D) 3 (C,F) 11 (C,E)5 (A,B) 8 D A B C D E F 0 8 2 3 5 11 Instead of 4 Instead of  Instead of  Remplacer (A,D) 4 avec (C,D) 3 Insert (C,E) 5 Insert (C,F) 11 (C,D) 3 (C,E) 5 (C,F) 11 18 CSI2510 -- PCC Mise à jour signifie: enlever les anciennes clés et remplacer par les nouvelles
  • 19.
    (A,B) 8 D A BC D E F 0 8 2 3 5 11 (C,D) 3 (C,E) 5 (C,F) 11 C B A E D F 0 3 2 8 5 8 4 8 7 1 2 5 2 3 9 RemoveMin() Mis-a-jour 19 CSI2510 -- PCC
  • 20.
    (A,B) 8 D A BC D E F 0 8 2 3 5 11 (C,E) 5 (C,F) 11 C B A E D F 0 3 2 8 5 8 4 8 7 1 2 5 2 3 9 RemoveMin() Mise à jour (D,F) 8 ? Yes 8 < 11 Remplacer (C,F) 11 avec (D,F) 8 20 CSI2510 -- PCC
  • 21.
    (A,B) 8 D A BC D E F 0 8 2 3 5 8 (C,E) 5 (D,F) 8 C B A E D F 0 3 2 8 5 8 4 8 7 1 2 5 2 3 9 RemoveMin() Mise à jour (D,F) 8 ? Yes 8 < 11 Remplacer (C,F) 11 avec (D,F) 8 21 CSI2510 -- PCC
  • 22.
    Pourquoi l‘algorithme deDijkstra fonctionne? L’algorithme de Dijkstra utilise un algorithme glouton. C’est-à-dire un algorithme qui effectue à chaque étape le choix optimal local dans l’espoir d’arriver à la solution optimale globale. C B A E D F 0 3 2 7 5 8 4 8 7 1 2 5 2 3 9  Supposons qu'il n'a pas trouvé toutes les plus courtes distances. Soit F le premier mauvais sommet que l'algorithme a traité.  Quand le nœud précédent, D, sur le vrai plus court chemin a été considéré, sa distance était correcte.  Mais l’arête (D,F) a été relaxée à ce moment-là!  Ainsi, aussi longtemps que d(F)>d(D) la distance de F ne peut pas être fausse. C'est-à-dire, il n'y a pas de mauvais sommet. 22 CSI2510 -- PCC
  • 23.
    Le temps d’exécution Sinous représentons G avec une liste d’adjacence, alors nous pouvons parcourir tous les sommets adjacents à u pendant un temps proportionnel à deg(u) La file de priorité Q Avec heap. while Q   do {insérer u dans le nuage C} A chaque itération: - Extraction des sommets avec la distance la plus petite: O(log n). - Mises à jour des clés: O(log n) pour chaque mise à jour (remplacer une clé et insérer dans le monceau)=>Apres chaque extraction (deg(u) mises à jour): O(deg(u) log n) En total: uG (1 + deg(u)) log n = O((n+2m) log n) = O(m*log n) Meilleur cas: O(n log n) Pire cas: O(n2 log n) 23 CSI2510 -- PCC
  • 24.
    Avec une séquencenon-triée: O(n) quand on extrait les éléments minimaux mais des mises à jour des clés plus rapides en O(1). Il y a n-1 extractions d’ordre n et m mises à jour d’ordre constant. Le temps d’exécution est O(n2+m) = O(n2 ) O(m log n) O(n2 ) Monceau Séquence En conclusion: 24 CSI2510 -- PCC Le temps d’exécution