ajout cours parcours, POO sur les graphes

This commit is contained in:
2025-03-09 18:32:21 +01:00
parent eda3dcfcaa
commit 5aaedd5918
3 changed files with 97 additions and 0 deletions

View File

@@ -39,6 +39,16 @@ def bfs(graphe, depart):
file.append(voisin) 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) ### Parcours en profondeur (DFS - Depth First Search)
Le parcours en profondeur explore un chemin le plus loin possible avant de revenir en arrière. Cest une approche de type pile (LIFO). Le parcours en profondeur explore un chemin le plus loin possible avant de revenir en arrière. Cest une approche de type pile (LIFO).
@@ -64,6 +74,14 @@ def dfs(graphe, depart, visite=None):
dfs(graphe, voisin, visite) dfs(graphe, voisin, visite)
``` ```
### Illustration
![Parcours_Profondeur](https://www.gaudry.be/img/math/graphe/graphes-dfs.gif)
----------
### Détection de cycles dans un graphe ### Détection de cycles dans un graphe
Un cycle est une chaîne fermée sans répétition darêtes. Pour détecter un cycle dans un graphe non orienté, on peut utiliser DFS : Un cycle est une chaîne fermée sans répétition darê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))}") print(f"{sommet}: {', '.join(map(str, voisins))}")
``` ```
------
Auteur : Florian Mathieu
Licence CC BY NC
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <br />Ce cours est mis à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/">Licence Creative Commons Attribution - Pas dUtilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International</a>.

70
Graphes/POO.md Normal file
View File

@@ -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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB