## Formulation sous forme d'un graphe: Comment (3min)?
## Formulation sous forme d'un graphe: Comment (3min)?
{width=80%}
{width=80%}
# Exemples d'application de plus court chemin
# Exemples d'application de plus courts chemins
## Formulation sous forme d'un graphe: Comment (3min)?
## Formulation sous forme d'un graphe: Comment (3min)?
...
@@ -161,9 +161,9 @@ graph LR;
...
@@ -161,9 +161,9 @@ graph LR;
* On aimerait plutôt avoir une somme...
* On aimerait plutôt avoir une somme...
# Exemples d'application de plus court chemin
# Exemples d'application de plus courts chemins
## Conversion du problème en plus court chemin
## Conversion du problème en plus courts chemins
* Soit `taux(u, v)` le taux de change entre la devise `u` et `v`.
* Soit `taux(u, v)` le taux de change entre la devise `u` et `v`.
* On pose `w(u,w)=-log(taux(u,v))`
* On pose `w(u,w)=-log(taux(u,v))`
...
@@ -213,7 +213,7 @@ Algorithmes de plus courts chemins
...
@@ -213,7 +213,7 @@ Algorithmes de plus courts chemins
* Trouver pour tout sommet $v\in V$, le chemin de poids minimal reliant $s$ à $v$.
* Trouver pour tout sommet $v\in V$, le chemin de poids minimal reliant $s$ à $v$.
* Algorithmes standards:
* Algorithmes standards:
* Dijkstra (arêtes de poids positif seulement);
* Dijkstra (arêtes de poids positif seulement);
* Bellman-Ford (arêtes de poids positifs ou négatifs, mais sans cycles).
* Bellman-Ford (arêtes de poids positifs ou négatifs, mais sans cycles négatifs).
* Comment résoudre le problèmes si tous les poids sont les mêmes?
* Comment résoudre le problèmes si tous les poids sont les mêmes?
. . .
. . .
...
@@ -387,10 +387,10 @@ si distance(u,v) > distance(u,w) + distance(w,v)
...
@@ -387,10 +387,10 @@ si distance(u,v) > distance(u,w) + distance(w,v)
* On assigne à chaque noeud une distance $0$ pour $s$, $\infty$ pour les autres.
* On assigne à chaque noeud une distance $0$ pour $s$, $\infty$ pour les autres.
* Tous les noeuds sont marqués non-visités.
* Tous les noeuds sont marqués non-visités.
* Depuis du noeud courant, on suit chaque arête du noeud vers un sommet non visité et on calcule le poids du chemin à chaque voisin et on met à jour sa distance si elle est plus petite que la distance du noeud.
* Depuis le noeud courant, on suit chaque arête du noeud vers un sommet non visité et on calcule le poids du chemin à chaque voisin et on met à jour sa distance si elle est plus petite que la distance du noeud.
* Quand tous les voisins du noeud courant ont été visités, le noeud est mis à visité (il ne sera plus jamais visité).
* Quand tous les voisins du noeud courant ont été visités, le noeud est mis à visité (il ne sera plus jamais visité).
* Continuer avec le noeud à la distance la plus faible.
* Continuer avec le noeud à la distance la plus faible.
* L'algorithme est terminé losrque le noeud de destination est marqué comme visité, ou qu'on a plus de noeuds qu'on peut visiter et que leur distance est infinie.
* L'algorithme est terminé losrque le noeud de destination est marqué comme visité, ou qu'on n'a plus de noeuds qu'on peut visiter et que leur distance est infinie.
# Algorithme de Dijkstra
# Algorithme de Dijkstra
...
@@ -541,10 +541,11 @@ element enfiler(element, data, priorite)
...
@@ -541,10 +541,11 @@ element enfiler(element, data, priorite)
sinon
sinon
tmp = element
tmp = element
prec = element
prec = element
tant que !est_vide(tmp) && priorite < priorite(tmp)