From 5aaedd59189b572501babd1cddf8be05af7bf102 Mon Sep 17 00:00:00 2001 From: Florian Mathieu Date: Sun, 9 Mar 2025 18:32:21 +0100 Subject: [PATCH] ajout cours parcours, POO sur les graphes --- Graphes/PARCOURS.md | 27 +++++++++++++ Graphes/POO.md | 70 ++++++++++++++++++++++++++++++++++ Graphes/assets/graphe_poo.png | Bin 0 -> 11356 bytes 3 files changed, 97 insertions(+) create mode 100644 Graphes/POO.md create mode 100644 Graphes/assets/graphe_poo.png diff --git a/Graphes/PARCOURS.md b/Graphes/PARCOURS.md index c5ff0fd..3390dc8 100644 --- a/Graphes/PARCOURS.md +++ b/Graphes/PARCOURS.md @@ -39,6 +39,16 @@ def bfs(graphe, depart): file.append(voisin) ``` + + +### Illustration du parcours en largeur + +![parcours_largeur.gif](https://glassus.github.io/terminale_nsi/T1_Structures_de_donnees/1.4_Graphes/data/bfs.gif) + + + + + ### Parcours en profondeur (DFS - Depth First Search) Le parcours en profondeur explore un chemin le plus loin possible avant de revenir en arrière. C’est une approche de type pile (LIFO). @@ -64,6 +74,14 @@ def dfs(graphe, depart, visite=None): dfs(graphe, voisin, visite) ``` + + +### Illustration + +![Parcours_Profondeur](https://www.gaudry.be/img/math/graphe/graphes-dfs.gif) + +---------- + ### Détection de cycles dans un graphe Un cycle est une chaîne fermée sans répétition d’arêtes. Pour détecter un cycle dans un graphe non orienté, on peut utiliser DFS : @@ -138,3 +156,12 @@ class Graphe: print(f"{sommet}: {', '.join(map(str, voisins))}") ``` +------ + + + +Auteur : Florian Mathieu + +Licence CC BY NC + +Licence Creative Commons
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. diff --git a/Graphes/POO.md b/Graphes/POO.md new file mode 100644 index 0000000..db50184 --- /dev/null +++ b/Graphes/POO.md @@ -0,0 +1,70 @@ +## Graphes et POO + +> Tout comme les arbres, il nous est possible de représenter les graphes sous la forme d'une classe Python. + + + +Nous souhaitons représenter le graphe ci-dessous sous la forme d'une classe Graphe. + +![Graphe_POO](assets/graphe_poo.png) + +On pourra créer celui-ci de cette manière + +```python +g = Graphe(['A', 'B', 'C', 'D', 'E']) +g.ajoute_arete('A', 'B') +g.ajoute_arete('A', 'C') +g.ajoute_arete('A', 'D') +g.ajoute_arete('A', 'E') +g.ajoute_arete('B', 'C') +g.ajoute_arete('C', 'D') +g.ajoute_arete('D', 'E') +``` + +Nous souhaitons aussi pouvoir tester si deux sommets sont voisins avec la méthode `sont_voisins` : + +```python +>>> g.sont_voisins('E', 'A') +True +>>> g.sont_voisins('E', 'B') +False +``` + +Enfin, nous voulons pouvoir obtenir facilement la liste de tous les voisins d'un sommet avec la méthode `voisins`: + +```python +>>> g.voisins('C') +['A', 'B', 'D'] +``` + +L'objet de type `Graphe` aura comme attributs : + +- une liste `liste_sommets` (donnée en paramètre dans la liste `liste_sommets`) +- un dictionnaire `adjacents`, où chaque sommet se verra attribuer une liste vide `[]`. + +### Implémentation + +```python +class Graphe: + def __init__(self, liste_sommets): + self.liste_sommets = liste_sommets + self.adjacents = {sommet : [] for sommet in liste_sommets} + + def ajoute_arete(self, sommetA, sommetB): + self.adjacents[sommetA].append(sommetB) + self.adjacents[sommetB].append(sommetA) + + def voisins(self, sommet): + return self.adjacents[sommet] + + def sont_voisins(self, sommetA, sommetB): + return sommetB in self.adjacents[sommetA] +``` + + + +------------- + + + +Merci à [Gilles Lassus](https://glassus.github.io/terminale_nsi/T1_Structures_de_donnees/1.4_Graphes/cours/#3-creation-dune-classe-graphe) pour la source. \ No newline at end of file diff --git a/Graphes/assets/graphe_poo.png b/Graphes/assets/graphe_poo.png new file mode 100644 index 0000000000000000000000000000000000000000..e532cd77a1da8daeb463a6cff285df7d64b002cc GIT binary patch literal 11356 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 HTRi(eyDbgR literal 0 HcmV?d00001