Najah.
Mon plan de révision⚡ Défi flash

Informatique · Classes prépa (CPGE) — 2ème année — TSI

Graphes : Représentation et parcours (BFS, DFS)

Le cours expliqué simplement, les questions que tous les élèves se posent et des exercices type examen national. Programme marocain, gratuit.

📘 Fiche de cours

L'essentiel du cours

Un graphe $G = (V, E)$ est défini par un ensemble de sommets $V$ et un ensemble d'arêtes $E$.

  • Représentation :
    • Matrice d'adjacence $M$ : $M[i][j] = 1$ s'il existe une arête entre $i$ et $j$, 0 sinon. Complexité spatiale $O(|V|^2)$.
    • Liste d'adjacence : Dictionnaire ou liste de listes où chaque sommet pointe vers ses voisins. Complexité spatiale $O(|V| + |E|)$.
  • Parcours :
    • BFS (Breadth-First Search) : Utilise une file (FIFO). Idéal pour trouver le plus court chemin dans un graphe non pondéré.
    • DFS (Depth-First Search) : Utilise une pile (LIFO) ou la récursion. Idéal pour détecter des cycles ou explorer toutes les composantes.

Méthodes à maîtriser

  1. Passer de la représentation matricielle à la liste d'adjacence et inversement.
  2. Écrire l'algorithme BFS avec une file collections.deque.
  3. Écrire l'algorithme DFS de manière récursive.
  4. Calculer la complexité temporelle : $O(|V| + |E|)$ pour les deux parcours.

Exemples corrigés

  • BFS : Pour un graphe donné, marquer le sommet de départ comme visité, l'enfiler. Tant que la file n'est pas vide, défiler, traiter, et enfiler les voisins non visités.
  • DFS : Pour un sommet $u$, marquer $u$ comme visité, puis pour chaque voisin $v$ non visité, appeler récursivement DFS(v).

Erreurs fréquentes

  • Oublier de marquer un sommet comme "visité", ce qui provoque une boucle infinie.
  • Confondre la complexité de la matrice ($O(|V|^2)$) avec celle de la liste d'adjacence ($O(|V|+|E|)$).
  • Utiliser une liste simple au lieu d'une deque pour le BFS (perte de performance en $O(n)$ pour pop(0)).

🌉 Jisr : les mots du chapitre FR ⇄ AR

Tu as appris les sciences en arabe ? Touche un mot pour voir sa traduction et une explication en darija.

La question que tu n'oses pas poser en classe ? Pose-la à UstadZéro jugement, même en darija, même à minuit. Il t'explique pas à pas et corrige ta démarche. Gratuit.

Défi flash : 4 questions

Sans compte

🎯 Graphes : Représentation et parcours (BFS, DFS)

1/4

Quelle est la complexité spatiale d'une matrice d'adjacence pour un graphe de $N$ sommets ?

❓ Questions fréquentes

C'est quoi la différence entre BFS et DFS au niveau de la mémoire ?
  1. BFS utilise une file (queue) : il stocke tous les voisins d'un niveau avant de passer au suivant.
  2. DFS utilise une pile (stack) ou la pile d'appels récursifs : il stocke le chemin en cours.
  3. En cas de graphe très large, BFS peut saturer la mémoire car il garde beaucoup de sommets en attente.

💡 À retenir : BFS est "large" (consomme plus de mémoire en largeur), DFS est "profond" (consomme selon la profondeur du graphe).

Kifach n7seb la complexité d'un parcours BFS ?
  1. Chaque sommet est ajouté dans la file une seule fois : $O(|V|)$.
  2. Chaque arête est parcourue pour vérifier les voisins : $O(|E|)$.
  3. La complexité totale est donc la somme des deux.

💡 À retenir : La complexité temporelle est toujours $O(|V| + |E|)$.

Est-ce qu'on peut utiliser DFS pour trouver le plus court chemin ?
  1. Non, DFS explore un chemin jusqu'au bout avant de revenir en arrière.
  2. Il peut trouver un chemin, mais pas forcément le plus court.
  3. BFS est l'algorithme standard pour le plus court chemin dans un graphe non pondéré.

💡 À retenir : BFS = plus court chemin, DFS = exploration/cycle.

Chno hiya la différence bin graphe orienté et non orienté f la matrice ?
  1. Graphe non orienté : La matrice est symétrique par rapport à la diagonale ($M[i][j] = M[j][i]$).
  2. Graphe orienté : La matrice n'est pas forcément symétrique, car l'arête va de $i$ vers $j$ mais pas forcément de $j$ vers $i$.

💡 À retenir : Symétrie = non orienté.

Comment savoir si un graphe est connexe avec un parcours ?
  1. Lancer un BFS ou DFS à partir d'un sommet quelconque.
  2. Compter le nombre de sommets visités.
  3. Si le nombre de sommets visités est égal au nombre total de sommets du graphe, alors il est connexe.

💡 À retenir : Connexité = tous les sommets sont accessibles.

Wach DFS récursif hsan mn DFS itératif ?
  1. Récursif : Plus simple à écrire et à lire.
  2. Itératif : Plus robuste pour les très grands graphes (évite l'erreur RecursionError).
  3. Les deux ont la même complexité.

💡 À retenir : Utilise la récursion pour le confort, l'itératif pour la sécurité mémoire.

Pourquoi on utilise une deque au lieu d'une list pour le BFS ?
  1. list.pop(0) en Python prend un temps $O(n)$ car il faut décaler tous les éléments.
  2. collections.deque.popleft() prend un temps $O(1)$.
  3. Cela change la complexité globale du BFS de $O(|V|^2)$ à $O(|V| + |E|)$.

💡 À retenir : Toujours utiliser deque pour les files.

Est-ce qu'un graphe peut avoir plusieurs composantes connexes ?
  1. Oui, c'est un graphe non connexe.
  2. On peut le détecter en lançant un parcours sur chaque sommet non encore visité.
  3. Chaque lancement de parcours correspond à une composante connexe.

💡 À retenir : Plusieurs composantes = plusieurs parcours nécessaires.

Kifach n'représentiw un graphe avec des poids sur les arêtes ?
  1. Matrice d'adjacence : On remplace 1 par le poids $w$ et 0 par l'infini ($\infty$).
  2. Liste d'adjacence : On stocke des tuples (voisin, poids) au lieu de juste le voisin.

💡 À retenir : La structure change pour inclure la valeur du poids.

Est-ce que le DFS peut boucler à l'infini ?
  1. Oui, s'il y a un cycle et qu'on ne garde pas de trace des sommets visités.
  2. Il faut toujours utiliser un ensemble visites pour marquer les sommets déjà traités.

💡 À retenir : visites est obligatoire pour éviter les cycles.

C'est quoi un graphe complet ?
  1. C'est un graphe où chaque sommet est relié à tous les autres sommets.
  2. Il possède $|V| \times (|V|-1) / 2$ arêtes.

💡 À retenir : Complet = tout le monde est lié à tout le monde.

Est-ce que le programme demande de savoir Dijkstra ?

(à vérifier par le professeur) : Le programme 2025-2026 se concentre sur BFS/DFS. Dijkstra est généralement hors programme pour cette section spécifique.

💡 À retenir : Concentre-toi sur BFS et DFS.

✍️ Exercices type examen national

Exercice 1

Soit un graphe $G$ défini par ses sommets $V = {A, B, C, D, E}$ et ses arêtes $E = {(A,B), (A,C), (B,D), (C,D), (D,E)}$.

  1. Donner la matrice d'adjacence de ce graphe (supposé non orienté).
  2. Donner la liste d'adjacence.
  3. Effectuer un parcours BFS en partant de A. Donner l'ordre de visite.
Voir la correction détaillée : inscription gratuite

Exercice 2

Écrire une fonction Python est_connexe(graphe) qui prend en entrée un dictionnaire représentant une liste d'adjacence et retourne True si le graphe est connexe, False sinon.

Voir la correction détaillée : inscription gratuite

Exercice 3

Soit un graphe orienté. Expliquer pourquoi le DFS est plus adapté que le BFS pour détecter un cycle.

Voir la correction détaillée : inscription gratuite

Un prof de Informatique pour aller plus loin

Les cours du soir avec des profs vérifiés arrivent : inscris-toi pour être prévenu(e) en premier.

Être prévenu(e) gratuitement

Autres chapitres de Informatique