diff --git a/slides/cours_26.md b/slides/cours_26.md index 93252f9a83b7d9cb3f1c2a1b13f2cfd7487e5e93..3cd98a3ba1775aac1e9f32edfa91eabd29c5e3b2 100644 --- a/slides/cours_26.md +++ b/slides/cours_26.md @@ -774,319 +774,3 @@ $$ * Game over! -# Algorithme de Prim - -## Structures de données - -* Dans quoi allons nous stocker les sommets? - -. . . - -* File de priorité min. -* Autre chose? - -. . . - -* Tableau des distances (comme pour Dijkstra). -* Autre chose? - -. . . - -* Tableau des parents (presque comme pour Dijkstra). -* Autre chose? - -. . . - -* Non. - -# Algorithme de Prim - -## Initialisation: Pseudo-code (2min) - -. . . - -```C -file_priorité, distance, parent initalisation(graphe) - r = aléatoire(graphe) - distance[r] = 0 - parent[r] = indéfini - fp = file_p_vide() - pour v dans sommets(graphe) - si v != r - distance[v] = infini - parent[v] = indéfini - fp = enfiler(fp, v, distance[v]) - retourne fp, distance, parent -``` - -# Algorithme de Prim - -## Algorithme: Pseudo-code (5min) - -. . . - -```C -sommets, parent prim(file_priorité, distance, parent) - sommets = vide - tant que !est_vide(file_priorité) - u, fp = défiler(file_priorité) - sommets = insérer(sommets, u) - pour v dans voisinage de u et pas dans sommets - // ou dans file_priorité - si w(u, v) < distance[v] - parent[w] = u - distance[w] = w(u, v) - fp = changer_priorité(fp, w, w(u, v)) - retourne sommets, parent -``` - -# Exemple d'algorithme de Prim - -::: columns - -:::: {.column width="40%"} - -## Un exemple - - - -:::: - -:::: column - -``` -FP | e | d | b | c | a | ----------------------------------- -D | 0 | inf | inf | inf | inf | - - | e | d | b | c | a | ----------------------------------- -P | - | - | - | - | - | -``` - -## Devient? - -. . . - -``` -FP | d | b | c | a | ----------------------------- -D | 4 | 5 | 5 | inf | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | e | - | -``` - -:::: - -::: - -# Exemple d'algorithme de Prim - -::: columns - -:::: {.column width="40%"} - -## Un exemple - - - -:::: - -:::: column - -``` -FP | d | b | c | a | ----------------------------- -D | 4 | 5 | 5 | inf | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | e | - | -``` - -## Devient? - -. . . - -``` -FP | a | c | b | ----------------------- -D | 2 | 4 | 5 | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | d | d | -``` - -:::: - -::: - -# Exemple d'algorithme de Prim - -::: columns - -:::: {.column width="40%"} - -## Un exemple - - - -:::: - -:::: column - -``` -FP | a | c | b | ----------------------- -D | 2 | 4 | 5 | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | d | d | -``` - -## Devient? - -. . . - -``` -FP | c | b | ----------------- -D | 4 | 5 | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | d | d | -``` - -:::: - -::: - -# Exemple d'algorithme de Prim - -::: columns - -:::: {.column width="40%"} - -## Un exemple - - - -:::: - -:::: column - -``` -FP | c | b | ----------------- -D | 4 | 5 | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | d | d | -``` - -## Devient? - -. . . - -``` -FP | b | ----------- -D | 5 | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | d | d | -``` - -:::: - -::: - -# Exemple d'algorithme de Prim - -::: columns - -:::: {.column width="40%"} - -## Un exemple - - - -:::: - -:::: column - -``` -FP | b | ----------- -D | 5 | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | d | d | -``` - -## Devient? - -. . . - -``` -FP | ----- -D | - - | e | d | b | c | a | ----------------------------------- -P | - | e | e | d | d | -``` - -:::: - -::: - -# Exercice: algorithme de Prim - -## Appliquer l'algorithme de Prim à (15min): - - - -# Exercice: algorithme de Prim - -## Solution - - - -# Complexité de l'algorithme de Prim - -\footnotesize - -```C -file_priorité, distance, parent initalisation(graphe) - // choix r et initialisation - pour v dans sommets(graphe) -O(|V|) // initialisation distance et parent - fp = enfiler(fp, v, distance[v]) - retourne fp, distance, parent -sommets, parent prim(file_priorité, distance, parent) - sommets = vide - tant que !est_vide(file_priorité) -O(|V|) u, fp = défiler(file_priorité) - sommets = insérer(sommets, u) - pour v dans voisinage de u et pas dans sommets - O(|E|) si w(u, v) < distance[v] - // màj dista + parent - O(|V|) fp = changer_priorité(fp, w, w(u, v)) - retourne sommets, parent -``` - -* $O(|V|)+O(|E|)+O(|V|^2)=O(|E|+|V|^2)$ -* Remarque: $O(|E|)$ n'est pas mutliplié par $O(|V|)$, car les arêtes parcourues qu'une fois en **tout**. - -# Algorithme de Kruskal -