Vous êtes sur la page 1sur 21

LGT Saint-Exupéry, Mantes-la-Jolie

Algorithmique

Théorie des graphes


Objectifs pédagogiques :

✓ Modéliser des situations sous forme de graphes.


✓ Écrire les implémentations correspondantes d’un graphe : matrice d’adjacence, liste de successeurs/de
prédécesseurs. Passer d’une représentation à une autre
✓ Parcourir un graphe en profondeur d’abord, en largeur d’abord
✓ Repérer la présence d’un cycle dans un graphe
✓ Chercher un chemin dans un graphe

Initiée par le grand mathématicien suisse Euler, avec le célèbre problème des 7 ponts de Königsberg, les applications
de la théorie des graphes et de la recherche opérationnelle sont aujourd'hui immenses tant au plan civil que militaire :

• aide à la prise de décision ;


• recherche de la meilleure stratégie ;
• optimisation (plus court chemin, GPS, coût minimal, ordonnancement des tâches …) ;
• réseaux de transports (autoroutes, chemins de fer, métro, lignes aériennes …) ;
• transport de l’énergie (électricité, gaz …) ;
• transport de l’informations : internet, réseaux sociaux …

La théorie des graphes n'est pas une branche indépendante des mathématiques, elle se rattache à la programmation
linéaire, la programmation convexe (où le concept plus général de fonction convexe remplace les fonctions linéaires
et affines), la topologie, le calcul des probabilités.

1. Un peu de vocabulaire sur les graphes

D’un point de vue mathématique, un graphe est la donnée d'un certain nombre de points du plan, appelés sommets,
certains étant reliés par des segments de droites ou de courbes (simples) appelés arêtes, la disposition des sommets
et la forme choisie pour les arêtes n'intervenant pas. Le nombre de sommets du graphe est son ordre. Sauf indication
contraire, un graphe sera considéré comme non orienté et les arêtes pourront être parcourues dans les deux sens. Ce
type de graphe peut se présenter dans des problèmes élémentaires de type combinatoire. La plupart des applications
de la théorie graphes, (problèmes d'optimisation, communications, trafics aériens, ...) conduisent à des graphes
orientés où les arêtes orientées sont appelées arcs. Le degré d'un sommet est le nombre d'arêtes auxquelles il est
relié. Deux sommets d'un graphe sont dits adjacents s'il existe une arête (ou un arc) qui les relie. Un graphe est
dit complet si deux quelconques de ses sommets sont adjacents

S1 S1

S2 S2

Sommet Sommet
S3 S3

Graphe non orienté Graphe orienté

Activité Terminale NSI – Théorie des graphes 1/21


LGT Saint-Exupéry, Mantes-la-Jolie

Dans les 2 exemples ci-dessus, les graphes sont d’ordre 3 et tous leurs sommets sont de degré 2. Les 2 graphes sont
en outre complets.

2. Le dilemme du gardien de parc

A B

?
A B C

D
C D
Situation réelle Situation modélisée par un graphe non orienté

Vous travaillez dans un parc et devez entretenir les ponts représentés en rouge sur la figure ci-dessus. Pour économiser
du temps et de l'énergie, vous désirez passer sur chaque pont une et une seule fois.
Q1. Etablir le graphe modélisant la situation décrite.
Q2. En partant de la zone C, trouvez tous les chemins possibles.
Q3. Cela est-il possible en commençant depuis l'île B ? Expliquez.
Q4. Quel est l’ordre du graphe ?
Q5. Précisez le degré de chaque sommet du graphe.
Q6. Pourquoi, selon vous, le graphe modélisant le situation étudiée est-il qualifié de non orienté.

3. Le problème des 7 ponts de Königsberg

Précurseur avec Leibniz de la théorie des graphes et de la topologie, Euler résolut (1735) le problème des sept ponts
de Königsberg (aujourd'hui Kaliningrad, Fédération de Russie) :

A B

?
A B C

D
C D
Situation réelle Situation modélisée par un graphe non orienté

Activité Terminale NSI – Théorie des graphes 2/21


LGT Saint-Exupéry, Mantes-la-Jolie
La ville de Königsberg avait 7 ponts qui traversent une rivière telle qu’illustrée ci-dessus. Euler se demanda s’il était
possible de faire une promenade à partir d’un des points A, B, C ou D, de traverser tous les ponts une seule fois et de
revenir à son point de départ. En représentant le problème par un graphe, on peut alors reformuler la question de la
promenade d’Euler ainsi : peut-on parcourir toutes les arêtes du graphe une unique fois et revenir à notre point de
départ ?
Les deux contraintes importantes sont :

1. Le promeneur doit revenir à son point de départ à la fin de son parcours, c’est-à-dire suivre ce qu’on appelle
un cycle.
2. Chaque pont doit être traversé une fois exactement (on appelle aujourd’hui « cycle eulérien » un tel cycle).
Essayer tous les chemins possibles peut devenir très long lorsque la taille du graphe augmente. Le génie d’Euler a été
de trouver une condition très simple pour savoir si un tel chemin existe. Euler a remarqué ceci :

• chaque pont ne doit être parcouru qu’une fois donc il faut autant de ponts pour quitter un quartier que pour y
revenir (sinon l’on ne reviendrait jamais au point de départ) ;
• il faut donc que chaque quartier comporte un nombre pair de ponts.

Un cycle est forcément non eulérien si au moins un de ses sommets possède un nombre impair d’arêtes.

Q7. Etablir le graphe modélisant la situation décrite.


Q8. Le problème des 7 ponts admet-il une solution ? Justifier.

4. Réseaux sociaux : modélisation par un graphe

Au premier trimestre 2020, Facebook© revendiquait 2,6 milliards d'utilisateurs actifs chaque mois, en hausse de 9,2% par
rapport à début 2019. Le réseau social américain a passé la barre symbolique des 2 milliards au deuxième trimestre 2017. A
noter que 42% des utilisateurs actifs mensuels de Facebook viennent d'Asie-Pacifique, 15,6% sont Européens et 9,7% sont
Nord-américains. Facebook permet à ses utilisateurs d’entrer des informations personnelles et d’interagir avec
d’autres utilisateurs. Les interactions entre utilisateurs reposent sur la notion « d’amis ».

4.1. Principe de la modélisation par un graphe non orienté


Sommet
Imaginez un réseau social ayant 7 abonnés (L, M, N, O, P, Q et R) où :
Arête
• L est ami avec M, N, O et P ;
• M est ami avec L et P ;
• N est ami avec L, O et P ;
• O est ami avec L,N,P,Q et R ;
• P est ami avec O,L et M ;
• Q est ami avec N et O ;
• R est ami avec O.

La description de ce réseau social, malgré son faible nombre


d'abonnés, est déjà quelque peu compliquée, alors imaginez cette
même description avec un réseau social comportant des millions
d'entre eux !
Il existe un moyen plus "visuel" pour représenter ce réseau social : on
peut représenter chaque abonné par un cercle (avec le nom de
l'abonné situé dans le cercle) et chaque relation "X est ami avec Y" par Modélisation du mini-réseau social sous
un segment de droite reliant X et Y ("X est ami avec Y" et "Y est ami la forme d’un graphe non orienté
avec X" étant représenté par le même segment de droite).
Le mini-réseau social décrit précédemment peut être modélisé sous
la forme du graphe ci-contre.

Activité Terminale NSI – Théorie des graphes 3/21


LGT Saint-Exupéry, Mantes-la-Jolie

◼ Un peu de vocabulaire sur les graphes des réseaux sociaux…


>>> La distance entre deux sommets d'un graphe est le nombre minimum d'arêtes pour aller du sommet à un autre.
Exemple : entre L et R la distance est 2.
>>> L'écartement d'un sommet est la distance maximale existant entre ce sommet et les autres sommets du graphe.
Exemple : pour le sommet Q, la plus grande distance avec un autre sommet est 3 ; l'écartement est donc de 3.
>>> Le centre d'un graphe est le sommet d'écartement minimal (le centre n'est pas nécessairement unique).
Exemple : les sommets Q et R ont un écartement de 3, les autres un écartement de 2 ; les centres sont donc L, N, O,
P.
>>> Le rayon d'un graphe est l'écartement d'un centre du graphe.
Exemple : les centres L, N, O, P ont un écartement de 2 ; le rayon du graphe est donc 2.
>>> Le diamètre d'un graphe est la distance maximale entre deux sommets du graphe.
Exemple : l’écartement max étant 3 (entre Q et M ou entre R et M), le diamètre du graphe est 3.

Q9. Construisez un graphe de réseau social à partir des informations suivantes :


• A est ami avec B, D et E ;
• B est ami avec A, C et D ;
• C est ami avec B et D ;
• D est ami avec A, B, C et E ;
• E est ami avec A et F ;
• F est ami avec E.
Q10. Compléter le tableau ci-dessous des distances entre sommets :

Distances A B C D E F
A 0
B 0
C 0
D 0
E 0
F 0

Q11. Quel est le centre du graphe


Q12. Quel est le rayon du graphe ?
Q13. Quel est le diamètre du graphe ?

4.2. Implémentation d'un graphe non orienté à l'aide d'une matrice d'adjacence

◼ Un graphe non orienté peut être transcrit sous la forme d’une matrice d’adjacence qui sera simple à coder dans un
programme Python. Une matrice est un tableau à double entrée :

◼ Comment construire une matrice d'adjacence ?


Il faut savoir qu'à chaque ligne correspond un sommet du graphe et qu'à chaque colonne correspond aussi un sommet
du graphe. À chaque intersection ligne i-colonne j (ligne i correspond au sommet i et colonne j correspond au sommet
j), on place un 1 s'il existe une arête entre le sommet i et le sommet j, et un zéro s'il n'existe pas d'arête entre le
sommet i et le sommet j.
Activité Terminale NSI – Théorie des graphes 4/21
LGT Saint-Exupéry, Mantes-la-Jolie
En d’autre terme, pour construire la matrice d’adjacence associée à un graphe, il suffit, pour chaque intersection ligne
/ colonne, de répondre à la question :
Est-ce que le sommet « X » est relié directement au sommet « Y » par une arête ?
Si la réponse est OUI → 1
Si la réponse est NON → 0

Graphe non orienté « est ami avec » Matrice d’adjacence associée

En Python on code une matrice d’adjacence sous la forme d’une liste de listes. Chaque sous-liste représente une
colonne de la matrice d’adjacence.

Remarques :
• Une matrice d’adjacence est qualifiée de matrice carrée car elle comporte toujours le même nombre de lignes
et de colonnes.
• Dans le cadre d’un graphe non orienté de type « est ami avec », les éléments de la matrice d’adjacence
associée sont symétrique par rapport à la grande diagonale des 0.

Q14. Ecrire la matrice d’adjacence correspondant au graphe non orienté décrivant la situation de la question Q9.
Q15. Compléter la matrice d’adjacence et écrire son codage Python correspondant au graphe non orienté suivant
traduisant la relation « est ami avec »

Graphe non orienté traduisant la relation :


« X est ami avec Y ». Matrice d’adjacence

Activité Terminale NSI – Théorie des graphes 5/21


LGT Saint-Exupéry, Mantes-la-Jolie
Q16. Ecrire un programme Python permettant de calculer le nombre d’amis de chaque utilisateur du réseau
« d’amitiés » précédent.

4.3. Implémentation d'un graphe orienté à l'aide d'une matrice d'adjacence

Dans le modèle du mini-réseau social précédent, le graphe est non orienté : il traduit seulement le fait qu’un utilisateur
est ami avec un autre (relation bijective). La notion de « followers » que l’on rencontre dans de nombreux réseaux
sociaux (Twitter en est un exemple), nécessite quant à elle d’orienter les arêtes du graphe (elles deviennent alors des
arcs) afin de traduire la relation « X » suit « Y ».
Ainsi dans l’exemple de graphe orienté ci-dessous, Alice (origine) suit Zoé et Chloé (extrémités).

Graphe orienté de traduisant la relation :


« X suit Y » Matrice d’adjacence
Remarque ; Zoé est la star du réseau social car elle ne suit personne mais tout le monde la suit.

Q17. Comment peut-on obtenir facilement le nombre de personnes suivies par une personne donnée ?
Q18. Comment peut-on obtenir facilement le nombre de personnes qui suivent une personne donnée ?
Q19. Compléter le programme Python de la question Q16 afin qu’il affiche en plus du nombre d’amis pour une
personne donnée, le nombre de personnes qu’elle suit et le nombre de personnes qui la suivent.

5. « Page rank » d’un moteur de recherche : modélisation par un graphe

5.1. Modélisation d’un réseau d’hyperliens à l’aide d’un graphe et d’une liste d’adjacence

On peut modéliser un réseau de pages web reliées entre elles par des hyperliens à l’aide d’un graphe orienté.
Dans l’exemple ci-dessous, la page web  possède 2 liens sortants (1 vers la page  et 1 vers la page ) et
2 liens entrants (1 depuis la page  et 1 depuis la page ).

Modélisation des liens sortants par liste


d’adjacence (liste de listes) :
Page
Lien sortant

G = [[0,2],[1,0],[2,1,3],[3,2]]
Ecriture simplifiée :

H = [[2],[0],[1,3],[2]]
Modélisation d’un réseau de pages web par un
graphe orienté Pages : 0 1 2 3 (indices)

Activité Terminale NSI – Théorie des graphes 6/21


LGT Saint-Exupéry, Mantes-la-Jolie
Le programme Python suivant permet de simuler le parcours aléatoire du graphe précédent en utilisant une liste
d’adjacence des hyperliens :

Q20. Modifier le programme précédent pour calculer la fréquence des visites de chaque page lors d’un parcours
aléatoire comportant nbEtapes :

Q21. Déterminer la liste d’adjacence du réseau de pages web ci-dessous

Activité Terminale NSI – Théorie des graphes 7/21


LGT Saint-Exupéry, Mantes-la-Jolie
Q22. Modifier le programme Python précédent tenant compte de la nouvelle liste d’adjacence. Afficher les
fréquentations de chaque page en donnant à nbEtapes les valeurs suivantes : 100, 1 000, 10 000. Qu’observez-vous ?
Remarque : on affichera pas les pages visitées au fur et à mesure du parcours du graphe.
Q23. Les résultats précédents sont-ils sensiblement modifiés si on déplace le lien rouge dans le réseau de pages web
précédent comme figuré ci-dessous ?

5.2. Pour aller plus loin : qu’est-ce-ce que le « Page Rank » (PR) ?

Le PageRank est l’algorithme d’analyse des liens hypertextes utilisé pour le classement des pages Web par le moteur
de recherche Google. En première approximation un « page rank » simplifié se rapproche des scores de fréquentation
de chaque page web calculés précédemment à l’aide des listes d’adjacence. Le PageRank n’est qu’un indicateur parmi
d’autres dans l’algorithme qui permet de classer les pages du Web dans les résultats de recherche. Ce système a été
inventé par Larry Page, cofondateur de Google. Ce mot est une marque déposée.

• Comprendre en vidéo le PR de Google avec PageRank Simulator : https://youtu.be/xdE-L-A2TLA


• PageRank Simulator : http://faculty.chemeketa.edu/ascholer/cs160/WebApps/PageRank/

◼ La toute première « formule magique » de calcul du PR par Google (la toute dernière est secrète) :

◼ Comment calculer un PS simplifié ? : http://www.canyouseome.com/comment-calculer-le-page-rank/


Activité Terminale NSI – Théorie des graphes 8/21
LGT Saint-Exupéry, Mantes-la-Jolie

6. Comment parcourir un graphe ?


Comme on l’a vu précédemment, un site web peut être modélisé par un graphe dans lequel les sommets
représentent les pages du site et les arêtes représentent les liens hypertextes (ou hyperliens) permettant d'aller
d'une page à une autre.

Dans tout ce qui suit, on supposera que ce graphe est connexe, c'est-à-dire qu'à partir d'une page donnée, toute
autre page est accessible par une série de liens (une chaîne).

L’objectif est de mettre en œuvre technique permettant de tester toutes les pages de ce site, c'est-à-dire à
parcourir ce graphe en passant par tous ses sommets.

6.1. Parcours en largeur : Breadth First Search (BFS)

◼ Comment ça marche ?

Pour le parcours en largeur (BFS pour Breadth First Search), on commence avec un nœud donné et on explore chacun
de ses voisins avant d'explorer leurs enfants. Autrement dit, on commence d'abord par aller sur la plus grande largeur
possible. Son implémentation repose sur une file (queue) dont le principe du premier entré, premier sorti (FIFO : First
In / First Out) permet de s'assurer que les nœuds découverts d'abord seront explorés en premier :

d
Illustration d’un parcours en profondeur sur un arbre distance = 0

Exploration

distance = 1

distance = 2

distance = 3

Principe de l’exploration d’un arbre selon un parcours en largeur

Remarque : on donne le nom de parcours en largeur d'un graphe car cet algorithme va visiter tous les sommets à
distance 1 du sommet de départ puis tous les sommets à distance 2 du sommet de départ puis tous les sommets à
distance 3 du sommet de départ etc...

Activité Terminale NSI – Théorie des graphes 9/21


LGT Saint-Exupéry, Mantes-la-Jolie
◼ Principe de l’algorithme :
Ressources à consulter :

http://math.univ-lyon1.fr/irem/Formation_ISN/formation_parcours_graphes/largeur/2_description1.html
https://youtu.be/NrQGxfFMYzs

On va procéder à un parcours en largeur du graphe en mettant les sommets successifs dans une file (structure
FIFO). Voici la description intuitive de l'algorithme :

1. On enfile le sommet de départ (on visite la page d'accueil du site).


2. On enfile les sommets adjacents à la tête de file (on visite les pages ciblées par la page d'accueil) s'ils ne sont
pas déjà présents dans la file.
3. On défile (c'est-à-dire on supprime la tête de file).
4. Tant que la file n'est pas vide, on ré-itère les points 2 et 3.

En d'autres termes, on défile toujours prioritairement les sommets (les pages) les plus tôt découverts.

◼ Programmation en Python :
Nous avons vu précédemment la notion de graphe et le fait que tout graphe pouvait être caractérisé par sa matrice
d'adjacence composée de 1 et de 0 selon que deux sommets sont ou ne sont pas reliés par une arête.

Une nouvelle façon d'encoder un graphe sous Python est d'utiliser un dictionnaire qui sera la représentation de sa
matrice d'adjacence. La clé associée à chaque sommet sera la liste des sommets adjacents :

Q24. Montrer, en partant du point B, que la méthode de parcours en largeur (BFS) du graphe précédent se ramène à
un arbre dont le sommet est b. On représentera en pointillés les arêtes entre deux sommets déjà explorés.

Activité Terminale NSI – Théorie des graphes 10/21


LGT Saint-Exupéry, Mantes-la-Jolie
Avec la représentation du graphe sous la forme d’un dictionnaire, la programmation du parcours en largeur (BFS) se
réalisera avec une fonction bfs(graphe, sommet_de_depart) dont les variables seront les suivantes :

• Un dictionnaire P tel que, en fin de parcours, pour tout sommet S du graphe, P[S] sera le père de S, c'est-à-
dire le sommet à partir duquel le sommet S a été découvert lors du parcours.
• Un dictionnaire couleur[] tel que, pour tout sommet S, couleur[S] soit blanc si le sommet S n'est pas passé
dans la file, gris si le sommet S est dans la file et noir si le sommet S est sorti de la file.
• Une liste Q utilisée comme file (FIFO) : on enfile un sommet lorsqu'il est découvert et on le défile lorsqu'il est
terminé (traitement prioritaire des sommets découverts au plus tôt).

En exemple d’appel à la fonction bfs(G, 'b') est donné ci-après :

Comprendre pas à pas le principe de fonctionnement de la fonction bfs(G,’sommet’) :

http://math.univ-lyon1.fr/irem/Formation_ISN/formation_parcours_graphes/largeur/3_python1.html

Q25. Assurez-vous que le résultat obtenu est conforme à celui obtenu à la main à la question Q24.
Q26. Tester le parcours du graphe en largeur depuis différents sommets et comparer le résultat obtenu avec la
méthode manuelle.

Il est également possible de coder le programme en faisant intervenir la notion de classe comme dans le programme
ci-après.

Activité Terminale NSI – Théorie des graphes 11/21


LGT Saint-Exupéry, Mantes-la-Jolie

Activité Terminale NSI – Théorie des graphes 12/21


LGT Saint-Exupéry, Mantes-la-Jolie
6.2. Parcours en profondeur : Depth First Search (DFS)

◼ Comment ça marche ?

Pour le parcours en profondeur (DFS pour Depth First Search), on commence avec un nœud donné et on explore
chaque branche complètement avant de passer à la suivante. Autrement dit, on commence d'abord par aller le plus
profond possible. Cet algorithme s'écrit naturellement de manière récursive et permet de trouver tous les nœuds
auquel un nœud est connecté.

◼ Principe de l’algorithme :
Ressources à consulter :
http://math.univ-lyon1.fr/irem/Formation_ISN/formation_parcours_graphes/profondeur/2_description2.html
https://youtu.be/kcedjJOjDpg

On va procéder à un parcours en profondeur du graphe en mettant les sommets successifs dans une pile (structure
LIFO). Voici la description intuitive de l'algorithme :

1. On empile le sommet de départ (on visite la page d'accueil du site).


2.
• Si le sommet de la pile possède des voisins qui ne sont pas dans la pile, ni déjà passés dans la
pile, alors on sélectionne l'un de ces voisins et on l'empile (en le marquant de son numéro de
découverte)
• Sinon on dépile (c'est-à-dire on supprime l'élément au sommet de la pile).
3. On recommence au point 2 tant que la pile n'est pas vide.

En d'autres termes, on traite toujours en priorité les liens des pages les plus tard découvertes.

Activité Terminale NSI – Théorie des graphes 13/21


LGT Saint-Exupéry, Mantes-la-Jolie
◼ Programmation en Python :

Q27. Montrer, en partant du point g, que la méthode de parcours en profondeur (DFS) du graphe précédent se ramène
à un arbre dont le sommet est g. On représentera en pointillés les arêtes entre deux sommets déjà explorés.

Avec la représentation du graphe sous la forme d’un dictionnaire comme dans le paragraphe précédent, la
programmation du parcours en profondeur (DFS) se réalisera avec une fonction dfs(graphe,
sommet_de_depart) dont les variables seront les suivantes :

• Un dictionnaire P tel que, en fin de parcours, pour tout sommet S du graphe, P[S] sera le père de S, c'est-à-
dire le sommet à partir duquel le sommet S a été découvert lors que parcours.
• Un dictionnaire couleur[] tel que, pour tout sommet S, couleur[S] soit blanc si le sommet S n'est pas passé
dans la file, gris si le sommet S est dans la file et noir si le sommet S est sorti de la file.
• Une liste Q utilisée comme pile (LIFO).

Q28. Tester le parcours du graphe en largeur depuis différents sommets et comparer le résultat obtenu avec la
méthode manuelle.

Il est également possible de coder le programme en faisant intervenir la notion de classe comme dans le programme
ci-après.

Activité Terminale NSI – Théorie des graphes 14/21


LGT Saint-Exupéry, Mantes-la-Jolie

Activité Terminale NSI – Théorie des graphes 15/21


LGT Saint-Exupéry, Mantes-la-Jolie

7. Comment détecter un cycle dans un graphe ?

7.1. Notion de cycle

Un cycle est un sous graphe dont les sommets peuvent être organisés en une séquence fermée.

◼ Graphe orienté :

3 4 5
2
5 Cycle

◼ Graphe non orienté :


4

2
5
3 3 4 5
Cycle

Q29. Représenter en Python chacun des graphes précédents par leur matrice d’adjacence. Ces graphes serviront à
tester les programmes des paragraphes suivants.

7.2. Parcours en largeur (BFS)

7.2.1. Graphe orienté

L'idée est très simple, pour vérifier s'il existe un cycle, il suffit de vérifier s'il existe un chemin partant d'un sommet
disons "v" et revenant à ce sommet pour tous les sommets. S'il existe un tel chemin, nous disons que le graphe
contient un cycle. Maintenant, la question est de savoir comment vérifier un tel chemin ? Là encore réponse à cette
question est très simple, exécutez une traversée à partir d'un sommet "v" si nous revenons à ce sommet, nous
retournons True sinon retournons False.

La fonction suivante vérifie s'il existe un chemin partant d'un sommet « u » vers un sommet « v » :

Activité Terminale NSI – Théorie des graphes 16/21


LGT Saint-Exupéry, Mantes-la-Jolie

La fonction ci-dessus est la fonction principale, maintenant pour vérifier s'il existe un cycle, il suffit de vérifier tous les
sommets s'il existe un chemin partant de ce sommet et y retournant :

Q30. A l’aide du programme ci-dessus vérifier que le graphe suivant est acyclique :

2
5
3

Activité Terminale NSI – Théorie des graphes 17/21


LGT Saint-Exupéry, Mantes-la-Jolie
7.2.1. Graphe non orienté

Pour un graphe non orienté, nous appliquons simplement le parcours en largeur pour détecter un cycle. L'idée est
d'utiliser un tableau pour mémoriser le parent de chaque sommet (De quel sommet nous avons découvert chaque
sommet). En découvrant les sommets, on vérifie si on retourne au sommet déjà visité et que ce sommet n'est pas le
parent du sommet courant, si c'est le cas, alors il existe un cycle.

Q31. A l’aide du programme ci-dessus vérifier que le graphe suivant est acyclique :

2
5
3

Activité Terminale NSI – Théorie des graphes 18/21


LGT Saint-Exupéry, Mantes-la-Jolie
7.3. Parcours en profondeur (DFS)

7.3.1. Graphe orienté

L'utilisation de la parcours en profondeur est un peu plus compliquée, car l'algorithme est récursif, et comme vous le
savez, derrière chaque algorithme récursif, il existe une pile utilisée pour les appels récursifs. Parce que pendant
l'exécution de l'algorithme, nous n'avons pas accès à cette pile, nous allons devoir créer une pile et suivre les sommets
déjà dans la pile. Comment cette pile est utile pour détecter un cycle ? Pour bien comprendre ce qui se passe, on
peut étudier l’exemple ci-dessous traitant de la fonction « factorielle de n » qui illustre la façon dont les appels récursifs
sont empilés vers la pile et dépilés :

Comme on peut l’observer sur l’exemple précédent, pendant les appels récursifs, on ajoute les appels récursifs à la pile, puis
une fois que l’on arrive au cas de base, on commence à supprimer les appels récursifs de la pile.

Revenons maintenant à la question de savoir comment il est utile de savoir quel élément est déjà dans la pile

Lors de l'exécution de l'algorithme, si nous revenons à un élément « i » (Visités[i] = True) qui existe déjà dans la pile
(Pile[i] = True), cela signifie qu'il existe un cycle. Une fois qu’un sommet est découvert, on le rend comme visité
(Visités[i] = True) et on ajoute également à la pile (Pile[i] = True). Une fois que l’on a fini de découvrir tous ses
sommets adjacents, on le supprime de la pile (Pile[i] = False)

Le programme suivant est la mise en œuvre du déroulement précédent :

Activité Terminale NSI – Théorie des graphes 19/21


LGT Saint-Exupéry, Mantes-la-Jolie

Q32. A l’aide du programme ci-dessus vérifier que le graphe suivant est acyclique :

2
5
3

Activité Terminale NSI – Théorie des graphes 20/21


LGT Saint-Exupéry, Mantes-la-Jolie
7.3.2. Graphe non orienté

La même idée générale peut être appliquée pour le graphe orienté, mais ici on doit également vérifier lorsque l’on
revient à un sommet, que ce sommet n'est pas le parent du sommet de l'appelant.

Q33. A l’aide du programme ci-dessus vérifier que le graphe suivant est acyclique :

2
5
3

Activité Terminale NSI – Théorie des graphes 21/21

Vous aimerez peut-être aussi