Skip to content

Commit c8d5753

Browse files
authored
Merge pull request #41 from JulesFouchy/S2_TD7
S2 TD7
2 parents dcd353d + 7e1ef07 commit c8d5753

File tree

1 file changed

+12
-13
lines changed

1 file changed

+12
-13
lines changed

content/TDs/S2/07_graphs.md

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ Si le nœuds de destination n'existe pas (comme clé du tableau associatif `adja
9393

9494
3. Implémenter la méthode `add_undirected_edge` en utilisant `add_directed_edge` pour ajouter deux edges dans les deux sens pour connecter deux nœuds passés en paramètre.
9595

96-
4. Implémenter la fonction `adjacency_list_from_adjacency_matrix` qui prend en paramètre une **matrice d'adjacence** (sous la forme d'un vecteur de vecteurs d'entiers) et qui retourne un graphe.
96+
4. Implémenter la fonction `build_from_adjacency_matrix` qui prend en paramètre une **matrice d'adjacence** (sous la forme d'un vecteur de vecteurs d'entiers) et qui retourne un graphe.
9797

9898
:::info Exemple
9999
Exemple pour le graphe suivant:
@@ -132,7 +132,7 @@ std::unordered_map<int, std::vector<WeightedGraphEdge>> adjacency_list {
132132

133133
:::
134134

135-
5. Écrire dans la fonction `main` un exemple d'utilisation de la fonction `adjacency_list_from_adjacency_matrix` pour créer un graphe à partir d'une matrice d'adjacence et créer un deuxième graphe en utilisant les méthodes `add_vertex` et `add_undirected_edge` pour ajouter les mêmes sommets et les mêmes arrêtes que dans le premier graphe. Ensuite, comparer les deux graphes pour vérifier qu'ils sont égaux.
135+
5. Écrire dans la fonction `main` un exemple d'utilisation de la fonction `build_from_adjacency_matrix` pour créer un graphe à partir d'une matrice d'adjacence et créer un deuxième graphe en utilisant les méthodes `add_vertex` et `add_undirected_edge` pour ajouter les mêmes sommets et les mêmes arrêtes que dans le premier graphe. Ensuite, comparer les deux graphes pour vérifier qu'ils sont égaux.
136136

137137
## Exercice 2 (traverser un graphe)
138138

@@ -146,7 +146,7 @@ Voilà la signature de la méthode à implémenter:
146146
void DFS(int const start, std::function<void(int const)> const& callback) const;
147147
```
148148
149-
`std::function` (`#include <functional>`) est un objet qui peut "stocker" n'importe quelle fonction qui a la même signature que celle donnée en paramètre (entre <kbd> < </kbd> et <kbd> > </kbd>). Cela permet de passer une fonction en paramètre d'une autre fonction. C'est très utile pour faire des fonctions génériques qui peuvent être utilisées de différentes manières. On peut passer en paramètre une fonction définit dans le code ou une fonction **lambda** (une fonction anonyme) qui est définie directement dans le code. C'est comme cela que fonctionne les fonctions `std::sort`, `std::find_if`, `std::accumulate`, ... de la STL.
149+
`std::function` (`#include <functional>`) est un objet qui peut "stocker" n'importe quelle fonction qui a la même signature que celle donnée en paramètre (entre <kbd> < </kbd> et <kbd> > </kbd>). Cela permet de passer une fonction en paramètre d'une autre fonction. C'est très utile pour faire des fonctions génériques qui peuvent être utilisées de différentes manières. On peut passer en paramètre une fonction définie dans le code ou une fonction **lambda** (une fonction anonyme). C'est comme cela que fonctionnent les fonctions `std::sort`, `std::find_if`, `std::accumulate`, ... de la STL.
150150
151151
Voilà à quoi ressemble l'appel de cette méthode avec une fonction **lambda** qui affiche les sommets visités (pour reproduire le comportement de la méthode `print_DFS`):
152152
```cpp
@@ -159,7 +159,7 @@ std::cout << std::endl;
159159

160160
L'algorithme de Dijkstra permet de trouver le plus court chemin entre un sommet de départ et un sommet d'arrivée dans un graphe pondéré.
161161

162-
Je vous invite à relire l'explication du cours [ici](/Lessons/S2/graphs/#dijkstra);
162+
Je vous invite à relire l'explication du cours [ici](/Lessons/S2/graphs/#dijkstra).
163163

164164
1. Donnons nous le graphe suivant:
165165

@@ -184,13 +184,13 @@ Je vous invite à relire l'explication du cours [ici](/Lessons/S2/graphs/#dijkst
184184
```cpp
185185
std::unordered_map<int, std::pair<float, int>> dijkstra(WeightedGraph const& graph, int const& start, int const end) {
186186
// On crée un tableau associatif pour stocker les distances les plus courtes connues pour aller du sommet de départ à chaque sommet visité
187-
// La clé est l'identifiant du sommet et la valeur est un pair (distance, sommet précédent)
187+
// La clé est l'identifiant du sommet et la valeur est une paire (distance, sommet précédent)
188188
std::unordered_map<int, std::pair<float, int>> distances {};
189189

190190
// On crée une file de priorité pour stocker les sommets à visiter
191-
// la pair contient la distance pour aller jusqu'au sommet et l'identifiant du sommet
191+
// la paire contient la distance pour aller jusqu'au sommet et l'identifiant du sommet
192192

193-
// Ce type compliqué permet d'indiquer que l'on souhaite trier les éléments par ordre croissant (std::greater) et donc les éléments les plus petits seront au début de la file (top) (Min heap)
193+
// Ce type compliqué permet d'indiquer que l'on souhaite trier les éléments par ordre croissant (std::greater) et donc les éléments les plus petits seront au début de la file (top) (C'est ce qu'on appelle un "Min heap")
194194
std::priority_queue<std::pair<float, int>, std::vector<std::pair<float, int>>, std::greater<std::pair<float, int>>> to_visit {};
195195

196196
// 1. On ajoute le sommet de départ à la liste des sommets à visiter avec une distance de 0 (on est déjà sur le sommet de départ)
@@ -203,21 +203,20 @@ std::unordered_map<int, std::pair<float, int>> dijkstra(WeightedGraph const& gra
203203
if (/* TODO */) {
204204
return distances;
205205
}
206-
// 3. On parcoure la liste des voisins (grâce à la liste d'adjacence) du nœud courant
206+
// 3. On parcoure la liste des voisins du nœud courant (grâce à la liste d'adjacence)
207207
for (/* TODO */) {
208208
// 4. on regarde si le nœud existe dans le tableau associatif (si oui il a déjà été visité)
209209

210210
auto find_node { /* TODO */ };
211211
bool const visited { /* TODO */ };
212212

213213
if (!visited) {
214-
// 5. Si le nœud n'a pas été visité, on l'ajoute au tableau associatif en calculant la distance pour aller jusqu'à ce nœud
215-
// la distance actuelle + le point de l'arrête)
214+
// 5. Si le nœud n'a pas été visité, on l'ajoute au tableau associatif en calculant la distance pour aller jusqu'à ce nœud (la distance actuelle + le point de l'arrête)
216215

217-
// 6. On ajout également le nœud de destination à la liste des nœud à visité (avec la distance également pour prioriser les nœuds les plus proches)
216+
// 6. On ajoute également le nœud de destination à la liste des nœuds à visiter (avec la distance également pour prioriser les nœuds les plus proches)
218217
}else {
219-
// 7. Si il a déjà été visité, On test si la distance dans le tableau associatif est plus grande
220-
// Si c'est le cas on à trouvé un plus court chemin, on met à jour le tableau associatif et on ajoute de nouveau le sommet de destination dans la liste à visité
218+
// 7. Si il a déjà été visité, on teste si la distance dans le tableau associatif est plus grande
219+
// Si c'est le cas on a trouvé un chemin plus court, on met à jour le tableau associatif et on ajoute de nouveau le sommet de destination dans la liste à visiter
221220
if (/* TODO */) {
222221
223222
}

0 commit comments

Comments
 (0)