Problème du plus court chemin

Download Report

Transcript Problème du plus court chemin

Le problème du plus
court chemin
Énoncé du problème et construction d’un modèle
Partitionnement des sommets par niveaux d’un graphe
fortement connexe sans circuit
Théorème d’optimalité de Bellman-Pontryagin
Algorithme de type Futur-Passé
Algorithme de type Passé-Futur (version graphique)
Approche vorace – Algorithme de DIJKSTRA
Recherche du pcc entre chaque paire de sommets – Algorithme
de FLOYD & WARSHALL
Énoncé du problème :
Considérons n villes V1, V2, …, Vn reliées entre elles par un réseau
routier.
Bob séjournant en V1 désire se rendre à la ville Vn. En examinant le
réseau routier reliant ces 2 villes et, parmi toutes les possibilités qui
s’offrent à lui, il retient quelques villes intermédiaires V2, V3, …, Vn-1
par lesquelles il pourrait passer.
Bob a un budget limité et désire se rendre de V1 à Vn par le plus court
chemin sans nécessairement passer par toutes les villes intermédiaires.
Par quelles villes, Bob doit-il passer pour minimiser la distance
totale parcourue ?
Le problème du plus court chemin
2
Construction d’un modèle :
Le réseau de transport de Bob peut se traduire facilement sous la
forme d’un graphe :
Vn-2
V2
V4
V1
V3
Vn
Vn-1
où les sommets représentent les villes et où les arcs représentent les
routes possibles pour aller d’une ville à l’autre.
Note : En l’absence d’arcs entre 2 villes, cela signifie qu’il n’y a pas
de route directe Le
entre
celles-ci.
problème du plus court chemin
3
Matrice associée au graphe :
Nous définissons un graphe orienté G = (S, U)
où
S = {s1, s2, …, sn}, l’ensemble des sommets du graphe,
U = {(x, y)  S x S | il existe une route directe allant de x à y},
l’ensemble des arcs du graphe.
Une matrice A = (aij), i = 1, 2, …, n
j = 1, 2, …, n
est définie comme suit :
associée au graphe G
1 si (si, sj)  U
aij =
0 autrement.
Le problème du plus court chemin
4
Exemple :
2
3
1
4
6
5
1
2
Matrice associée à G : 3
4
5
6
1
0
0
0
1
1
0
2
1
0
0
0
1
0
3
1
1
0
0
0
0
4
0
1
1
0
0
0
Le problème du plus court chemin
5
0
0
1
1
0
0
6
0
0
0
0
1
0
5
Matrice des distances :
Soit D = (dij) la matrice des distances entre chacune des villes où
dij représente la distance de la route reliant directement la
ville Vi à la ville Vj.
On suppose par convention que :
dij =
+  si i  j et (si, sj)  U
0 si i = j.
Note : Cette matrice des distances peut représenter une mesure de
temps, de coût, de probabilité ou autre chose.
Le problème du plus court chemin
6
Exemple d’un graphe arc-valué :
3
B
C
9
4
8
A
3
2
6
E
7
G
4
D
7
13
6
F
2
H
Le problème du plus court chemin
7
Exemple d’un graphe arc-valué :
Soit le réseau routier suivant et le graphe correspondant,
Le problème du plus court chemin
8
Formulation du problème :
En ajoutant un arc fictif (sn, s1), on obtient :
 dij zij
Min
i = 1, 2, …, n
j = 1, 2, …, n
tel que (si, sj)  U
sujet à  zij
j = 1, 2, …, n
tel que (si, sj)  U
= 0 i.
 zki
k = 1, 2, …, n
tel que (sk, si)  U
zn1 = 1
zij  0
i = 1, 2, …, n; j = 1, 2, …, n tel que (si, sj)  U.
Cela équivaut à envoyer une unité de flot de 1 à n au moindre coût.
C’est donc un cas particulier du problème de flot à coût minimal.
Le problème du plus court chemin
9
Remarque :
Nous sommes amenés à résoudre 3 types de problèmes impliquant
des plus courts chemins :
(i) un pcc entre un sommet i et un sommet j;
(ii) un pcc entre un sommet i et tous les autres sommets du graphe;
(iii) un pcc entre chaque paire de sommets dans un graphe.
Les méthodes proposées pour résoudre le premier problème sont
appropriées pour les 2 autres problèmes également.
On peut utiliser la méthode du simplexe en programmation linéaire
pour résoudre ce problème mais il existe des méthodes beaucoup
plus efficaces.
Le problème du plus court chemin
10
Rappel de quelques définitions sur la structure de graphe :
Chemin :
Une suite d’arcs u1, u2, …, uk telle que l’extrémité terminale
de chaque arc coïncide avec l’extrémité initiale de l’arc
suivant dans la suite.
Chemin de longueur k :
Exemple :
Un chemin comprenant k arcs.
Chemin de longueur 5 du graphe G
(1,2) – (2, 3) – (3, 5) – (5, 2) – (2, 4).
Circuit : Un chemin de longueur finie dont le sommet origine est
identique au sommet extrémité du chemin.
Exemple :
Circuit de longueur 4 du graphe G
(2, 3) – (3, 5) – (5, 1) – (1, 2).
Le problème du plus court chemin
11
Si un graphe orienté contient un circuit dont la longueur est < 0
(un cycle négatif), il se peut que le plus court chemin n’existe pas.
1
1
-5
5
4
6
2
-1
2
1
3
3
On exclut d’emblée ce type de graphe de la discussion subséquente.
Le problème du plus court chemin
12
Graphe non orienté :
U désigne plutôt un ensemble d’arêtes i.e.
un ensemble de paires non ordonnées de sommets de S.
Exemple :
(3, 2) – (3, 5) – (1,5) – (2, 1) sont des arêtes du graphe.
Chaîne d’un graphe non orienté :
Une suite d’arêtes distinctes u1, u2, …, uk avec la propriété qu’il
existe k + 1 sommets x1, x2, …, xk+1 tels que ui  (xi, xi+1),  1  i  k.
Exemple :
(3, 2) – (3, 5) – (1,5) – (2, 1) est une chaîne.
Cycle : Une chaîne où x1 = xk+1.
Graphe connexe :
Graphe non orienté dans lequel il est toujours possible de relier entre
eux 2 sommets quelconques par une chaîne.
Le problème du plus court chemin
13
Résolution du plus court chemin sur un graphe non orienté :
Cela se ramène au même problème que celui posé sur un graphe
orienté, à condition que les dij  0 pour tout (i,j).
Il s’agit de remplacer chaque arête (i, j) dans le graphe par 2 arcs
(i, j) et (j, i) portant tout deux la même mesure dij = dji.
Si l’un des dij était < 0, ceci créerait des cycles négatifs.
Graphe fortement connexe :
Graphe orienté où il existe tjrs un chemin allant de x à y  x, y  S.
Nous allons nous intéresser dans ce qui suit aux graphes
fortement connexes sans circuit.
Le problème du plus court chemin
14
Relation d’ordre strict R
Soit un graphe orienté G fortement connexe et sans circuit,
soit x, y  S et x  y,
considérons la relation suivante :
(R)
Note :
x  y  il existe un chemin de longueur non nulle de x vers y.
R est dite aussi relation d’antériorité :
si x  y , on dira que x est un ancêtre de y et
que y est un descendant de x.
R est transitive : x  y et y  z  x  z.
R est antisymétrique : x  y  non (y  x).
Le problème du plus court chemin
15
Partitionnement des sommets par niveaux d’un graphe fortement
connexe sans circuit
Tous les éléments d’un même niveau n’ont pas d’ancêtres dans le
niveau qui suit, ni de descendants dans le niveau qui précède.
Les éléments du premier niveau n’ont pas d’ancêtres et ceux du
dernier niveau n’ont pas de descendants.
L’ordre des sommets d’un même niveau est indifférent i.e.
les sommets d’un même niveau ne sont pas reliés entre eux par des
arcs.
Une décomposition par niveaux existe toujours mais
elle n’est pas nécessairement unique.
Le problème du plus court chemin
16
Illustration de la méthode de partitionnement des sommets par
niveaux d’un graphe fortement connexe sans circuit
Exemple :
1
8
5
4
2
7
6
3
Ai  la iième ligne de la matrice associée au graphe.
Le problème du plus court chemin
17
V0 – A5 =
V1 – A2 =
V2 – A6 =
V3 – A1 – A3 =
V4 – A7 =
V5 – A4 =
Le problème du plus court chemin
18
Procédé :
Déterminons d’abord les sommets qui n’ont pas d’ancêtres :
V0 = A1 + A2 + … + A8.
On constate que le sommet 5 n’admet aucun arc du type (- , 5).
Le sommet 5 forme donc le niveau I.
Pour déterminez le niveau II, il faut chercher tous les sommets
dont le seul ancêtre est 5 :
V1 = V0 – A5.
Le sommet 2 n’a pas d’autres ancêtres que le sommet 5.
Le sommet 2 forme donc le niveau II.
Comme on peut le constater, pour obtenir les sommets d’un niveau,
il suffit d’enlever au vecteur précédent les lignes associées aux
sommets du niveau précédent.
Le problème du plus court chemin
19
Le graphe peut alors se mettre sous la forme :
Note :
Le sommet 1 peut être indifféremment placé dans l’un quelconque
des niveaux IV, V ou VI.
En supposant les sommets 1 et 3 au niveau IV, on peut choisir comme
ordonnancement :
5 – 2 – 6 – 1 – 3 – 7 – 4 – 8 ou encore
20
5 – 2 – 6 – 3 – 1 – 7 – 4 – 8.
Note :
Le PCC de V1 à V8 se résume au graphe :
Solution triviale.
8
1
Le PCC de V2 à V8 se résume au graphe suivant
(il faut négliger V5 et les arcs qui en sont issus) :
1
8
2
6
7
4
3
Le problème du plus court chemin
21
Théorème d’optimalité de Bellman-Pontryagin :
Il s’énonce sous l’une des 2 formes suivantes :
Passé - Futur
Tout chemin reliant la ville V1 à la ville Vn est optimal si
tout chemin partiel de V1 à Vk issu de ce chemin est lui-même
optimal de V1 à Vk et ce pour tous les indices k de ce chemin.
Futur - Passé
Tout chemin reliant la ville V1 à la ville Vn est optimal si
tout chemin partiel de Vk à Vn issu de ce chemin est lui-même
optimal de Vk à Vn et ce pour tous les indices k de ce chemin.
Le problème du plus court chemin
22
Reprenons l’exemple présenté antérieurement :
3
B
C
9
4
2
8
A
3
G
6
E
7
4
D
7
13
6
F
2
H
En énumérant tous les chemins possibles de A à H, on en déduit que
la distance minimale est 17 et que le PCC est AEFH.
Note : On peut vérifier que le théorème est satisfait pour E et F.
Le problème du plus court chemin
23
Présentation d’un algorithme de type Futur-Passé :
Renumérotons les villes selon un ordonnancement obtenu à l’aide de
l’approche précédente.
A
B
G
E
C
D
F
H
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
1
2
3
4
5
6
7
8
3
4
2
3
9
8
5
2
7
4
7
3
1
4
6
6
13
6
7
2
Le problème du plus court chemin
8
24
Il s’agit d’énumérer les chemins de longueur au plus k = 1, puis au
plus k = 2, et ainsi de suite, dont l’extrémité terminale est la ville n.
Posons vk(i)  longueur du PCC de i à n ayant au plus k arcs,
 i = 1, 2, …, n.
 k = 1, 2, …, n.
Remarque : vk(n) = 0,
Posons pk(i)  indicateur servant à retracer le PCC de i à n
ayant au plus k arcs,
 i = 1, 2, …, n.
k=1
k>1
v1(i) = din,
 i = 1, 2, …, n - 1.
p1(i) = i,
 i = 1, 2, …, n.
vk(i) = MIN (dij + vk-1(j) )
1jn
 i = 1, 2, …, n - 1.
pk(i) = la valeur j pour laquelle MIN est atteint.
Le problème du plus court chemin
25
À quel moment s’arrête-t-on ?
Étant donné qu’il est toujours possible d’ordonnancer un graphe
connexe et sans circuit et de classer ses sommets par niveaux,
s’il y a N niveaux,
le sommet 1 appartient au premier niveau,
le sommet n au dernier niveau,
les chemins reliant le sommet 1 au sommet n sont au plus
de longueur N – 1.
En pratique, on arrête à l’itération k où vk(i) = vk-1(i)  i.
Comment retracer le chemin optimal de i à n ?
(i, pk-1(i), pk-2(pk-1(i)), …, p1(p2(p3(… pk-1(i))), n)
en éliminant les valeurs identiques.
Le problème du plus court chemin
26
Considérons l’exemple précédent :
i
1
2
3
4
v1(i) 



p1(i) 1
2
3
4
5

5
6
6
6
7
2
7
8
0
8
v2(i)
p2(i)

1

2
15
7
9
7
8
7
6
6
2
7
0
8
v3(i)
p3(i)
17
4
11
5
15
7
9
7
8
7
6
6
2
7
0
8
v4(i)
p4(i)
17
4
11
5
15
7
9
7
8
7
6
6
2
7
0
8
L’algorithme s’arrête car v4(i) = v3(i)  i.
Exemple : Chemin optimal du sommet 1 au sommet 8 :
(1 – 4 – 7 – 8)
avec une longueur = 17.
Énoncé de l’algorithme de Bellman – Kalaba (Type Futur – Passé)
(0)
Renuméroter les sommets suivant l’ordonnancement précédent.
Réécrire la matrice des distances.
(1)
Poser v1(i) = din,
p1(i) = i,
Poser k = 2.
(2)
Faire vk(i) = MIN (dij + vk-1(j) )
1jn
 i = 1, 2, …, n,
 i = 1, 2, …, n.
 i = 1, 2, …, n - 1.
pk(i) = la valeur j pour laquelle MIN est atteint.
Poser vk(n) = 0,
(3)
(4)
pk(n) = n.
Si vk(i) = vk-1(i)  i
alors aller à (4)
sinon faire k = k + 1
aller à (2).
vk-1(1) représente la valeur optimale du problème posé.
Le problème du plus court chemin
28
Il reste à retracer le chemin optimal.
(5)
Poser t = k – 1 et x(t) = 1.
(6)
Faire x(t – 1) = pt(x(t)).
(7)
Si t > 1alors
faire t = t – 1,
aller à (6)
sinon le chemin optimal est le suivant :
(1, x(k-2), x(k-3), …, x(2), x(1), n)
où on élimine tous les sommets qui se répètent
sauf un.
Il reste à renuméroter les indices comme ils
étaient initialement.
FIN
Le problème du plus court chemin
29
Remarque :
Il n’est pas nécessaire d’ordonnancer les sommets du graphe
avant d’appliquer l’algorithme, mais cela est préférable, car il nous
permet d’avoir des  sous la diagonale de la matrice des distances.
Cela permet de simplifier l’algorithme précédent !
1
2
3
4
5
6
7
8
1
0







2
9
0






3
3

0





4
8
4
7
0




5

3

2
0



Le problème du plus court chemin
6




4
0


7


13
7
6

0

8





6
2
0
30
Énoncé de l’algorithme de type Passé – Futur
(0)
Renuméroter les sommets suivant l’ordonnancement précédent.
Réécrire la matrice des distances.
(1)
Poser u1(j) = d1j,
p1(j) = j,
Poser k = 2.
(2)
Soit uk(j)  longueur du PCC de 1 à j ayant au plus k arcs,
 j = 1, 2, …, n.
 j = 2, 3, …, n.
faire uk(j) = MIN (dij + uk-1(i) )
1in
 j = 1, 2, …, n,
 j = 1, 2, …, n.
pk(j) = la valeur i pour laquelle MIN est atteint.
(3)
Poser uk(1) = 0,
pk(1) = 1.
Si uk(j) = uk-1(j)  j
alors aller à (4)
sinon faire k = k + 1,
Le problème du plus court chemin
aller à (2).
31
(4)
uk-1(n) représente la valeur optimale du problème posé.
Il reste à retracer le chemin optimal.
(5)
Poser t = k – 1 et x(t) = n.
(6)
Faire x(t – 1) = pt(x(t)).
(7)
Si t > 1alors
faire t = t – 1,
aller à (6)
sinon le chemin optimal est le suivant :
(1, x(1), x(2), …, x(k - 2), n)
où on élimine tous les sommets qui se répètent
sauf un.
Il reste à renuméroter les indices comme ils
étaient initialement.
FIN
Le problème du plus court chemin
32
Critère d’arrêt de cet algorithme :
u1(j)  u2(j)  u3(j)  u4(j)  … uk(j)  longueur du pcc entre 1 et j j.
Si le graphe contient au moins un chemin entre 1 et j et il n’y a pas
de cycles négatifs, alors un pcc contiendrait au plus n-1 arcs ce qui
implique que un-1(j)  longueur du pcc entre 1 et j j.
En fait, l’algorithme arrête lorsque uk(j) = uk-1(j)  j.
Le problème du plus court chemin
33
Considérons l’exemple précédent :
i
1
2
3
4
u1(j) 0
9
3
8
p1(j) 1
2
3
4
5

5
6

6
7

7
8

8
u2(j)
p2(j)
0
1
9
2
3
3
8
4
10
4

6
15
4

8
u3(j)
p3(j)
0
1
9
2
3
3
8
4
10
4
14
5
15
4
17
7
u4(j)
p4(j)
0
1
9
2
3
3
8
4
10
4
14
5
15
4
17
7
L’algorithme s’arrête car u4(j) = u3(j)  j.
Exemple : Chemin optimal du sommet 1 au sommet 8 :
(1 – 4 – 7 – 8)
avec une longueur = 17.
Version « graphique » de l’algorithme de type Passé – Futur
Il est possible d’appliquer directement ces algorithmes sur le graphe
lui-même au moyen d’un marquage des sommets.
À chaque sommet j est associé une double case :
Indicateur servant à retracer le PCC de 1 à j.
Valeur minimale des chemins allant du sommet 1 à ce sommet j.
Reprenons le même exemple.
Le problème du plus court chemin
35
Pour déterminer les valeurs minimales associées aux sommets, il est
préférable de procéder à leurs évaluations selon un ordonnancement
connu : 1 – 2 – 3 – 4 – 5 – 6 – 7 – 8.
k=1
3
9
2
4
2
3
3 3
9
3
0 1
1
8
 5
5
4
4
2
7
8
4
7
6
 6
6
13
6
 7 7
2
Le problème du plus court chemin
8
 8
36
k=2
3
9
2
4
2
3
3 3
9
3
0 1
1
8
4
4
10 4
5
2
7
8
4
7
6
14 5
6
13
6
15 4 7
2
8
17 7
k = 3 Idem.
Le problème du plus court chemin
37
Reprenons le même exemple sans ordonnancement des sommets.
L’ordre A - B - C - D - E - F - G – H sera respecté.
k=1
9
B
3
B
9
4
8
A
0 A
7
G
8
 D
6
E
D
7
13
G
4
2
E
3
3
 C
C
6
F
 F
2
H
Le problème du plus court chemin
 H
38
k=2
9
3
B
B
9
4
8
A
0 A
7
G
8
14 C
6
E
D
7
13
G
4
2
E
3
3
10 E
C
6
F
2
15 E
H
k=3
17 F
Idem.
Note : Lorsqu’il n’existe pas de cycles de longueur négative, cette
méthode convient.
Le problème du plus court chemin
39
Arborescence des plus courts chemins avec comme origine A
À partir des résultats obtenus, on peut construire facilement une telle
arborescence.
9
3
B
B
9
4
8
A
0 A
7
G
8
14 C
6
E
D
7
13
G
4
2
E
3
3
10 E
C
6
F
2
15 E
H
Le problème du plus court chemin
17 F
40
Approche vorace – Algorithme de DIJKSTRA (dij > 0)
Posons LC(s)  longueur du pcc entre 1 et s dont les sommets
intermédiaires font partie de C,
s  S.
pC(s)  le sommet qui précède s dans ce pcc.
LC(i) = d1i, i = 2, …, n
0, i = 1.
Poser pC(s) = 1 s  1  S.
(1) Poser C = {1}.
(2) Trouver k  S – C tel que
MIN LC(j)
jS–C
est atteint.
Poser C = C {k}.
(3)
Si C <> S alors
poser LC(j) = MIN{LC(j) , LC(k) + dkj}
si MIN est atteint à LC(k) + dkj, pC(j) = k
Retournez à l’étape 2.
j  S–C
j  S–C
41
Théorème :
À chaque itération de l’algorithme, lorsque k est ajouté à C,
LC(k) est la longueur du pcc de 1 à k, sans restriction.
Exemple :
2
2
7
2
5
1
3
1
4
5
5
5
4
1
3
4
7
7
6
Note : L’algorithme fournit le pcc de 1 à tout autre sommet. Si l’on
cherche le pcc entre 1 et un sommet s, alors on peut arrêter
42
l’algorithme au moment où s entre dans C.
C
1
0
2
2
1
3
5
1
4

1
5
4
1
6

1
7

1
{1}
LC
pC
0
2
1
4
2
9
2
4
1

1

1
{1, 2}
LC
pC
0
2
1
4
2
9
2
4
1
7
3

1
{1, 2, 3}
LC
pC
0
2
1
4
2
9
2
4
1
7
3

1
{1, 2, 3, 5}
LC
pC
0
2
1
4
2
8
6
4
1
7
3
14
6
{1, 2, 3, 5, 6}
LC
pC
Le problème du plus court chemin
43
LC
pC
0
2
1
4
2
8
6
4
1
7
3
13
4
{1, 2, 3, 5, 6, 4}
pcc entre 1 et 7 :
7, pC(7), pC(4), pC(6), …, 1
ou encore
7, 4, 6, 3, 2, 1.
Le tracé du pcc est obtenu en procédant à reculons.
Note : S’il n’y a pas de chemin entre 1 et j dans le graphe, alors
LC(j) =  à la fin de l’algorithme.
Le problème du plus court chemin
44
Recherche du pcc entre chaque paire de sommets
L’algorithme de FLOYD – WARSHALL admet des arcs de
longueur négative mais pas de cycles négatifs.
On pourrait appliquer l’un des algorithmes précédents n fois pour
obtenir ce résultat mais l’algorithme suivant est plus efficace.
Posons
Lij(m) = longueur d’un pcc entre i et j, sujet à la condition que
le chemin ne passe pas par les sommets m, m+1, …, n
(i et j exceptés),
nous avons l’équation de récurrence suivante :
Lij(m+1) = min {Lij(m), Lim(m) + Lmj(m)}.
Le pcc ne passe pas par m.
Le pcc passe par m.
Le problème du plus court chemin
45
Énoncé de l’algorithme FLOYD - WARSHALL
(1)
Poser Lij(1) = dij,
pij(1) = j,
Poser k = 1.
(2)
 i,j = 1, 2, …, n,
 i,j = 1, 2, …, n.
 j = 1, 2, …, n.
Faire Lij(k+1) = min {Lij(k), Lik(k) + Lkj(k)},
Si le pcc passe par k alors pij(k + 1) = k
sinon pij(k + 1) = pij(k)
(3)
Si k == n
alors aller à (4)
sinon faire k = k + 1,
aller à (2).
Le problème du plus court chemin
46
Il reste à retracer le chemin optimal entre i et j.
(4)
Poser x(1) = j, x(2) = pij(n+1) et t = 3.
(5)
Faire x(t) = pix(t-1)(n+1).
(6)
Si t <> n - 1
alors
faire t = t + 1,
aller à (5)
sinon le chemin optimal est le suivant :
(i = x(t+1), x(t), …, x(1) = j).
FIN
Le problème du plus court chemin
47
2
Exemple :
4
3
4
1
-2
L(1)
0 4
 0
-2 
 3
p(1)
1 2
1 2
1 2
1 2

1
0

3
3
3
3
4
1
1

4
1
0
L(2)
0 4 
 0 1
-2 2 0
 3 
4
4
4
4
p(2)
1 2
1 2
1 1
1 2
3
3
3
3
3

4
1
0
L(3)
0 4 5 8
 0 1 4
-2 2 0 1
 3 4 0
L(4)
0 4
-1 0
-2 2
2 3
5 6
1 2
0 1
4 0
4
4
4
4
p(3)
1 2
1 2
1 1
1 2
p(4)
1 2
3 2
1 1
3 2
2
3
3
2
2
3
3
2
2
4
4
4
3
3
2
4
L(5)
0 4 5 6
-1 0 1 2
-2 2 0 1
2 3 4 0
p(5)
1 2
3 2
1 1
3 2
2
3
3
2
3
3
2
4
Chemin optimal entre 1 et 4 :
x
1 3 2 4
Le problème du plus court chemin
49
Conclusion
Ce sujet a été traité dans la plupart des livres portant sur la
recherche opérationnelle.
Toutefois, je vous réfère au livre suivant :
« Ronald L. Rardin, Optimization in Operations Research.
Prentice Hall, 1998, 919p. »
Le problème du plus court chemin
50