diff --git a/slides/cours_25.md b/slides/cours_25.md index 5b4c21ace3d064de6be88daa97adf86cb0474446..0df9fe93fb0bdf940614ecae56d80d0c3d5de19e 100644 --- a/slides/cours_25.md +++ b/slides/cours_25.md @@ -949,7 +949,8 @@ matrice floyd_warshall(distance, n, w) pour k de 1 à n pour i de 1 à n pour j de 1 à n - distance[i][j] = min(distance[i][j], distance[i][k] + distance[k][j]) + distance[i][j] = min(distance[i][j], + distance[i][k] + distance[k][j]) retourne distance ``` @@ -957,3 +958,134 @@ matrice floyd_warshall(distance, n, w) ## La matrice de précédence +* On a pas encore vu comment reconstruire le plusc court chemin! +* On définit, $P_{ij}^{(k)}$, qui est le prédécesseur du sommet $j$ depuis $i$ avec les sommets intermédiaires $\in\{1, 2, ..., k\}$. +$$ +P^{(0)}_{ij}=\left\{ +\begin{array}{ll} + \mbox{vide}, & \mbox{si } i=j\mbox{, ou }w(i,j)=\infty\\ + i, & \mbox{sinon}. +\end{array} +\right. +$$ + +* Mise à jour +$$ +P^{(k)}_{ij}=\left\{ +\begin{array}{ll} + P^{(k-1)}_{\mathbf{i}j}, & \mbox{si } d_{ij}^{(k)}\leq d_{ik}^{(k-1)}+d_{kj}^{(k-1)}\\ + P^{(k-1)}_{\mathbf{k}j}, & \mbox{sinon}. +\end{array} +\right. +$$ + +. . . + +* Moralité: si le chemin est plus court en passant par $k$, alors il faut qu'il soit le prédécesseur! + +# Algorithme de Floyd--Warshall + +## La matrice de précédence (pseudo-code, 3min) + +. . . + +```C +matrice, matrice floyd_warshall(distance, n, w) + pour k de 1 à n + pour i de 1 à n + pour j de 1 à n + n_distance = distance[i][k] + distance[k][j] + if n_distance < distance[i][j] + distance[i][j] = n_distance + précédence[i][j] = précédence[k][j] + retourne distance, précédence +``` + +# Algorithme de Floyd--Warshall (exercice) + + +::: columns + +:::: column + + + + +:::: + +:::: column + +## Que vaut $P^{(0)}$ (3min)? + +. . . + +$$ +P^{(0)}=\begin{bmatrix} +- & 1 & 1 & - & 1 \\ +2 & - & 2 & - & 2 \\ +3 & 3 & - & 3 & 3 \\ +4 & - & - & - & 4 \\ +- & - & - & 5 & - \\ +\end{bmatrix} +$$ + +:::: + +::: + +# Algorithme de Floyd--Warshall (exercice) + + +::: columns + +:::: column + + + + +:::: + +:::: column + +## Que vaut $P^{(5)}$ (10min)? + +. . . + +$$ +P^{(5)}=\begin{bmatrix} +- & 1 & 1 & 5 & 1 \\ +2 & - & 1 & 5 & 2 \\ +2 & 3 & - & 3 & 3 \\ +4 & 1 & 1 & - & 1 \\ +4 & 1 & 1 & 5 & - \\ +\end{bmatrix} +$$ + +:::: + +::: + +# Exercice: retrouver le chemin entre 1 et 4 (5min) + +$$ +P=\begin{bmatrix} +- & 1 & 1 & 5 & 1 \\ +2 & - & 1 & 5 & 2 \\ +2 & 3 & - & 3 & 3 \\ +4 & 1 & 1 & - & 4 \\ +4 & 1 & 1 & 5 & - \\ +\end{bmatrix} +$$ + +. . . + +## Solution + +* Le sommet $5=P_{14}$, on a donc, $5\rightarrow 4$, on veut connaître le prédécesseur de 5. +* Le sommet $1=P_{15}$, on a donc, $1\rightarrow 5\rightarrow 4$. The end. + +# Exercice complet + +## Appliquer l'algorithme de Floyd--Warshall au graphe suivant + + diff --git a/slides/figs/floyd_exercice.png b/slides/figs/floyd_exercice.png new file mode 100644 index 0000000000000000000000000000000000000000..309cdec2c4bff89714619d859bc945fead406d4f Binary files /dev/null and b/slides/figs/floyd_exercice.png differ