1 \documentclass[]{report}
2 \usepackage[a4paper]{geometry}
3 \geometry{hmargin=1.5cm, vmargin=1.5cm }
4 \usepackage[utf8]{inputenc}
5 \usepackage[T1]{fontenc}
6 \usepackage[french]{babel}
7 \usepackage{amsmath,amssymb,latexsym,eufrak,euscript,array}
11 \usetikzlibrary{arrows}
12 \usetikzlibrary{automata}
13 \usetikzlibrary{snakes}
14 \usetikzlibrary{shapes}
16 \usepackage[hang,centerlast]{subfigure}
20 \newtheorem{definition}{Définition}
21 \newtheorem{theoreme}[definition]{Théorème}
22 \newtheorem{proposition}[definition]{Proposition}
23 \newtheorem{exemple}[definition]{Exemple}
25 \newtheorem{Exo}[definition]{Exercice}
29 {}\end{Exo}\vspace{-1em}
35 \title{Cours Mathématiques Discrètes
36 \\IUT Belfort Montbéliard}
37 \author{{\sc Pierre-Cyrille HEAM}}
40 %%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 \chapter{Graphes finis orientés}
55 \section{Premières définitions}
57 Un {\bf graphe fini orienté} est un couple $(V,E)$ où
59 \item $V$ est un ensemble fini dont les éléments sont appelés {\bf sommets}
60 ou {\bf noeuds} ou {\bf états}.
61 \item $E\subseteq V\times V$ est un ensemble de couples d'éléments de $V$,
62 appelés {\bf arêtes} ou {\bf transitions}.
65 Par exemple $\left(\{1,2,3\},\{(1,2),(2,2),(3,1)\}\right)$ est un graphe
66 fini orienté. Le choix des lettres $V$ et $E$ viennent de l'anglais pour
67 {\it vertice} et {\it edge}. On rappelle que dans un ensemble (entre $\{\}$)
68 les éléments ne sont pas ordonnés et n'apparaissent qu'au plus une fois. En
69 revanche dans un couple (deux éléments entre parenthèse), les éléments sont
70 ordonnés. Le couple $(1,2)$ est différent du couple $(2,1)$.
74 Les couples $(V,E)$ suivants sont-ils des graphes finis orienté~?
76 \item $V=\{1,2,3\}$ et $E=\{(1,3)\}$~?
77 \item $V=\{1,2,3\}$ et $E=\{(1,6),(2,4)\}$~?
78 \item $V=\{1,2,3\}$ et $\emptyset$~?
79 \item $V=\{1,2,3\}$ et $E=\{\{1,3\}\}$~?
80 \item $V=\mathbb{N}$ et $E=\{(1,3)\}$~?
84 {\bf Sauf mention contraire, tous les graphes étudiés dans ce polycopié
85 seront des graphes finis orientés, que nous appellerons simplement {\it
86 graphes} par la suite.}
88 Un graphe se représente souvent par un dessin où les sommets sont des points
89 (parfois entourés d'un cercle) et les arêtes des flèches~: si $(x,y)$ est
90 une arête, on dessine une flèche entre $x$ et $y$. Par exemple le graphe
91 $$(\{1,2,3,4\},\{(1,1),(1,2),(3,1),(2,4),(3,4)\})$$ peut se dessiner comme sur la
92 figure~\ref{fig:g1}. Comme on peut le voir, il n'y a pas unicité de la façon
93 de dessiner un graphe.
97 \subfigure[première possibilité]{
99 \node (1) at (0,0) {$1$};
100 \node (2) at (4,0) {$2$};
101 \node (3) at (2,-0.7) {$3$};
102 \node (4) at (2,0.7) {$4$};
103 \path[->,>=triangle 90] (1) edge[loop above] node [above] {} ();
104 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
105 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
106 \path[->,>=triangle 90] (3) edge[] node [above] {} (1);
107 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
110 \subfigure[deuxième possibilité]{
113 \node (1) at (0,0) {$1$};
114 \node (2) at (3,0) {$2$};
115 \node (3) at (2,-0.7) {$3$};
116 \node (4) at (5,-0.7) {$4$};
117 \path[->,>=triangle 90] (1) edge[loop above] node [above] {} ();
118 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
119 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
120 \path[->,>=triangle 90] (3) edge[] node [above] {} (1);
121 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
125 \caption{Représentation d'un graphe}\label{fig:g1}
130 Dessiner les graphes suivants.
132 \item $V=\{1,2,3,4,5\}$ et $E=\{(1,2),(2,1),(3,4),(4,4),(4,5),(5,3)\}$.
133 \item $V=\{1,2,3,4,5\}$ et $E=\{(1,4),(4,1),(3,4),(4,4),(4,5),(5,3)\}$.
135 Donner sous forme ensembliste ($V$ et $E$) le graphe suivant~:
139 \node (1) at (0,0) {$1$};
140 \node (2) at (4,0) {$2$};
141 \node (3) at (2,-1) {$3$};
142 \node (4) at (2,1) {$4$};
143 \path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3);
144 \path[->,>=triangle 90] (2) edge[] node [above] {} (1);
145 \path[->,>=triangle 90] (3) edge[bend left] node [above] {} (1);
146 \path[->,>=triangle 90] (3) edge[] node [above] {} (2);
147 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
148 \path[->,>=triangle 90] (4) edge[] node [above] {} (2);
152 Le dessin ci-dessous représente-t-il un graphe~? Si oui le donner
153 explicitement, sinon dire pourquoi.
157 \node (1) at (0,0) {$1$};
158 \node (2) at (4,0) {$2$};
159 \node (3) at (2,-1) {$3$};
160 \node (4) at (2,1) {$4$};
161 \path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3);
162 \path[->,>=triangle 90] (2) edge[] node [above] {} (1);
163 \path[->,>=triangle 90] (1) edge[bend right] node [above] {} (3);
164 \path[->,>=triangle 90] (3) edge[] node [above] {} (2);
165 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
166 \path[->,>=triangle 90] (4) edge[] node [above] {} (2);
174 Dans un graphe, les {\bf voisins} d'un sommet $x$ sont tous les sommets $y$
175 tels que $(x,y)$ soit dans~$E$.
178 Pour le graphe de la figure~\ref{fig:grapheexo1}, quels
179 sont les voisins de $3$~? de $7$~? Quels sommets ont $9$ pour voisin~?
181 \begin{tikzpicture}[scale = 0.8]
182 \node (0) at (-2,-1) {0};
184 \node (1) at (0,0) {1};
185 \node (2) at (3,0) {2};
186 \node (3) at (6,0) {3};
187 \node (4) at (9,0) {4};
188 \node (5) at (12,0) {5};
190 \node (6) at (0,-2) {6};
191 \node (7) at (3,-2) {7};
192 \node (8) at (6,-2) {8};
193 \node (9) at (9,-2) {9};
194 \node (10) at (12,-2) {10};
196 \node (11) at (15,0) {11};
197 \node (12) at (15,-2) {12};
199 \node (13) at (0,-4) {13};
200 \node (14) at (3,-4) {14};
201 \node (15) at (6,-4) {15};
202 \node (16) at (9,-4) {16};
203 \node (17) at (12,-4) {17};
204 \node (18) at (15,-4) {18};
208 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
209 \path[->,>=triangle 90] (0) edge[] node [swap] {} (2);
210 \path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3);
212 \path[->,>=triangle 90] (1) edge[] node [swap] {} (2);
213 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
214 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
215 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
216 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
218 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
220 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
221 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
222 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
224 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
225 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
226 \path[->,>=triangle 90] (5) edge[] node [swap] {} (11);
227 \path[->,>=triangle 90] (5) edge[] node [swap] {} (12);
228 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
232 \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
233 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
235 \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
236 \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
239 \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
241 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
242 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
243 \path[->,>=triangle 90] (8) edge[] node [swap] {} (14);
244 \path[->,>=triangle 90] (8) edge[] node [swap] {} (15);
246 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
247 \path[->,>=triangle 90] (9) edge[] node [swap] {} (8);
248 \path[->,>=triangle 90] (9) edge[] node [swap] {} (16);
250 \path[->,>=triangle 90] (10) edge[] node [swap] {} (4);
251 \path[->,>=triangle 90] (10) edge[] node [swap] {} (5);
252 \path[->,>=triangle 90] (10) edge[] node [swap] {} (17);
254 \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
256 \path[->,>=triangle 90] (13) edge[] node [swap] {} (0);
257 \path[->,>=triangle 90] (16) edge[] node [swap] {} (17);
258 \path[->,>=triangle 90] (17) edge[] node [swap] {} (18);
259 \path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16);
262 \caption{Graphe 1}\label{fig:grapheexo1}
270 On considère la fonction $f$ de $\{0,\ldots,7\}$ dans $\{0,\ldots,7\}$ qui à
271 $x$ associe son reste modulo $3$. Dessiner le graphe où $V=\{0,\ldots,7\}$ et
272 $(x,y)\in E$ si et seulement si $y=f(x)$. Mêmes question avec $(x,y)\in E$
273 ssi $x^2=y \mod 5$ (c'est-à-dire si $x^2-y$ est un multiple de $5$). Même question avec $(x,y)\in E$ ssi $xy=1 \mod 6$.
277 On considère $V=\{maison, voiture, poisson, porte, cartable, grue\}$ et
278 $(x,y)\in E$ si et seulement $x$ est avant $y$ dans l'ordre du dictionnaire.
279 Dessiner le graphe $(V,E)$.
280 Même question mais cette fois ci $(x,y)\in E$ si et seulement $x$ et
281 $y$ ont au moins deux lettres en commun.
285 Soit $G=(V,E)$ un graphe. Comment voit-on sur un dessin de $G$ que la relation
286 $E$ est une application bijective~? que la relation $E$ est transitive~?
292 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
293 \section{Chemins, boucles et circuits}
296 Soit $G=(V,E)$ un graphe. Un {\bf chemin} est une suite finie
297 $(x_1,x_2),(x_2,x_3),\ldots,(x_{n},x_{n+1})$ d'arêtes consécutives. L'entier
298 $n$ est appelé {\bf taille} ou {\bf longueur} du chemin. Le sommet $x_1$ est l'{\bf origine}
299 du chemin et $x_n$ sa {\bf destination}. On dit aussi que ce chemin part de
300 $x_1$ pour arriver en $x_n$.
301 Dans le graphe de la figure~\ref{fig:grapheexo1}, $(0,1),(1,2),(2,6)$ est un
302 chemin partant de $0$, arrivant en $6$ et de longueur $3$. Par convention,
303 de tout point part un chemin vers lui même de longueur $0$ (qui n'utilise
307 Une {\bf boucle} est un chemin dont le sommet d'origine est aussi le sommet
308 d'arrivée. Une boucle qui ne passe pas deux fois par le même sommet (sauf à
309 l'origine et à la destination) est appelé un {\bf circuit}. Dans le graphe
310 de la figure~\ref{fig:grapheexo1}, $(5,12),(12,10),(10,5)$ est un circuit.
312 $$(0,1),(1,7)(7,13)(13,0),(0,3),(3,7),(7,13),(13,0)$$
313 est une boucle mais n'est pas un circuit.
314 Un chemin qui ne passe jamais deux fois par le même sommet est dit {\bf sans
319 Dans le graphe de la figure~\ref{fig:grapheexo1} donner
321 \item Un circuit de taille $1$,
322 \item Une boucle de longueur $9$ passant par $4$,
323 \item Un chemin sans boucle de $0$ à $18$,
324 \item Un chemin sans boucle de taille au moins $10$.
329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ùù
330 \section{Graphe et modélisation}
332 L'objectif de ce chapitre est de voir comment passer d'un problème concret à
333 un problème de graphe.
336 On considère le plan ci-dessous d'un musée. La porte d'entrée est en bas à
343 \draw (0,0) rectangle +(6,4);
344 \draw (0,0) rectangle +(1.5,1);
345 \draw (0,0) rectangle +(1.5,2);
346 \draw (0,0) rectangle +(1.5,3);
347 \draw (0,0) rectangle +(1.5,4);
348 \draw (1.5,2) rectangle +(1.5,2);
349 \draw (1.5,1) rectangle +(3,3);
350 \draw (0,0) rectangle +(4.5,1);
352 \draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ;
353 \draw (0.5,0.9) [fill=white]rectangle +(0.5,.2);
354 \draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2);
355 \draw (2,1-0.1) [fill=white]rectangle +(0.5,.2);
358 \draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
359 \draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
360 \draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
361 \draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5);
362 \draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5);
363 \draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
367 \item Représenter sous forme de graphe ce musée, en mettant un sommet par
369 \item On suppose qu'un gardien peut surveiller la salle dans laquelle il se
370 trouve ainsi que les salles voisines. Combien faut-il de gardiens au
372 Formuler ce problème, d'une manière générale, dans le vocabulaire des
375 \item Un groupe de visiteurs souhaite admirer toutes les salles du musée.
376 Peut-il le faire sans jamais passer deux fois par la même salle (on ne
377 compte pas le chemin de retour; le groupe peut partir de n'importe quelle
378 salle aussi)~? Proposer une formulation générale de ce
379 problème en utilisant le vocabulaire des graphes.
381 \item Le soir, le conservateur souhaite avant de fermer le musée passer dans
382 toutes les salles puis ressortir, tout en minimisant le trajet (il part de
383 l'entrée et ressort par l'entrée/sortie). Quel
384 chemin doit-il prendre~? Formuler ce problème de façon général en
385 utilisant le vocabulaire des graphes.
392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
394 On considère un ensemble fini $V$ de joueurs de tennis, et le graphe orienté
395 $(V,E)$ tel que $(x,y)\in E$ si et seulement si $x$ a déjà gagné un match
396 contre $y$. Donner des formulations dans le vocabulaire de la théorie des
397 graphes des propriétés suivantes.
400 \item Il y a un joueur qui n'a jamais perdu.
401 \item Il y a un joueur qui n'a jamais gagné.
402 \item Un joueur ne joue jamais contre lui-même.
403 \item Tous les joueurs ont déjà joué au moins un match conte un autre
405 \item Il y a un joueur qui a déjà joué contre tout le monde.
406 \item Il y a un joueur qui a déjà gagné contre tout le monde.
407 \item Il y a un joueur qui a joué contre tout le monde et perdu tous
413 On considère un graphe représentant la carte d'une ville~: chaque n\oe{}ud est
414 un croisement, chaque arête un tronçon de rue, codant le sens de
415 circulation. On considère de plus que les neouds sont coloriés, en rouge
416 (s'il y a un feu de signalisation au croisement) ou en bleu (s'il n'y a pas
418 Exprimer, dans le vocabulaire de la théorie des graphes les
419 propriétés suivantes.
422 \item Il n'y a pas de sens unique.
423 \item Il n'y a pas d'impasse.
424 \item De n'importe où, je peux aller partout.
425 \item De n'importe où, je peux aller partout en passant par au plus trois
426 feux de signalisation.
427 \item Deux croisements consécutifs ne peuvent avoir tout deux des feux.
428 \item Il n'y a jamais plus de deux rues qui se croisent à la fois.
429 \item Il n'y a ni pont, ni tunnel.
434 On considère le graphe $G$ dont les sommets sont les configurations possible
435 d'un rubics cube, et il y a une arête entre deux configurations si l'on peut
436 passer de l'une à l'autre en jouant un coup (c'est-à-dire une rotation d'un
437 quart de tour d'un coté). Exprimer avec le vocabulaire de la théorie des
438 graphes les propriétés suivantes (on ne cherche pas à savoir si elles sont
441 \item Il y a toujours une solution.
442 \item A partir de certaines configurations, il n'y a pas de solution.
443 \item De toute position, si je modifie le cube, je peux revenir à cette
445 \item Il existe une position dans laquelle je peux résoudre le rubics cube,
446 mais pas en moins de 30 coups.
447 \item Si dans une position je peux résoudre le rubics cube, alors je peux le
448 résoudre en moins de 30 coups.
454 On considère un ensemble de $n$ enfants portant chacun un dossard différent,
455 numéroté de $1$ à $n$, et jouant à cache-cache. On considère le graphe dont
456 les sommets sont les entiers de $1$ à $n$ et il y a une arête entre $i$ et
457 $j$ si l'enfant avec le dossard $i$ peut voir l'enfant avec le dossard $j$.
458 Exprimer dans le vocabulaire de la théorie des graphes les propriétés
462 \item Il y a un enfant bien caché qu'aucun autre ne peut voir.
463 \item Il y a un enfant qui ne voit personne.
464 \item Un enfant se voit toujours lui-même.
465 \item Il y a deux enfants qui se voient l'un l'autre.
466 \item Tout enfant voit au moins un autre enfant.
472 Un homme se trouve au bord d'une rivière avec un choux, une chèvre et loup.
473 Il possède une barque et veut traverser la rivière. Cependant, il ne peut
474 mettre en même temps, en plus de lui, dans la barque qu'un des trois. Et,
475 malheureusement aussi, il ne peut laisser sur une rive seul le loup avec la
476 chèvre, ni la chèvre avec le choux.
479 Modéliser le problème avec un graphe et proposer une solution.
483 On considère un site Web statique, installé sur un serveur. On se pose les
484 questions suivantes, liées à l'ergonomie du site~:
486 \item Puis-je à l'aide de la souris uniquement accéder à toutes les pages du
487 site à partir de la page d'accueil~?
488 \item Puis-je toujours en un clic retourner à la page d'accueil~?
489 \item Puis-je, à partir de n'importe quelle page, accéder à n'importe quelle
490 autre page en moins de 3 clics~?
493 Proposer une modélisation de cette situation par un graphe, puis décrire des
494 algorithmes pour répondre aux questions posées.
503 \draw (0,0) rectangle +(6,4);
504 \draw (0,0) rectangle +(1.5,1);
505 \draw (0,0) rectangle +(1.5,2);
506 \draw (0,0) rectangle +(1.5,3);
507 \draw (0,0) rectangle +(1.5,4);
508 \draw (1.5,2) rectangle +(1.5,2);
509 \draw (1.5,1) rectangle +(3,3);
510 \draw (0,0) rectangle +(4.5,1);
512 \draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ;
513 \draw (0.5,0.9) [fill=white]rectangle +(0.5,.2);
514 \draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2);
515 \draw (2,1-0.1) [fill=white]rectangle +(0.5,.2);
518 \draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
519 \draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
520 \draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
521 \draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5);
522 \draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5);
523 \draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
525 \caption{Plan du musée 1}\label{m1}
530 On considère le musée décrit dans la figure~\ref{m1}. Le directeur
531 souhaite, pour une exposition exceptionnelle, placer un gardien dans chaque
532 salle. Il recrute pour cela des gardiens espagnols (qui ne parlent que
533 l'espagnol) et des gardiens italiens (qui ne parlent qu'italien). Afin qu'il
534 ne discutent pas entre eux, il ne veut pas que deux gardiens de la même
535 nationalité soient dans des salles voisines. Est-ce possible~?
538 Même question avec le musée de la figure~\ref{m2}.
543 \draw (0,0) rectangle +(6,4);
544 \draw (0,0) rectangle +(1.5,1);
545 \draw (0,0) rectangle +(1.5,2);
546 \draw (0,0) rectangle +(1.5,3);
547 \draw (0,0) rectangle +(1.5,4);
548 \draw (1.5,2) rectangle +(1.5,2);
549 \draw (1.5,1) rectangle +(3,3);
550 \draw (0,0) rectangle +(4.5,1);
552 \draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ;
553 \draw (0.5,0.9) [fill=white]rectangle +(0.5,.2);
554 \draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2);
555 \draw (2,1-0.1) [fill=white]rectangle +(0.5,.2);
558 \draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
559 %\draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
560 \draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
561 \draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5);
562 %\draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5);
563 \draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
565 \caption{Plan du musée 2}\label{m2}
569 Généraliser ce problème sur les graphes. Décrire un algorithme pour le
574 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
575 \section{Codage des graphes}
577 On s'intéresse maintenant à coder les graphes (en machine). Il y a deux
578 méthodes principales (qui admettent des variantes), le codage par liste
579 d'adjacence et le codage par matrice d'adjacence.
582 \subsection{Codage par matrices d'adjacence}
584 Soit $G=(V,E)$ un graphe. On suppose, sans perte de généralité, que
585 $V=\{1,\ldots,n\}$. On appelle {\bf matrice d'adjacence} de $V$ le tableau
586 (matrice) de taille $n$ sur $n$ ne contenant que des $0$ ou des $1$ et
587 défini par~: la case de la $i$-ème ligne et de la $j$-ième colonne contient
588 un $1$ si et seulement si $(i,j)\in E$.
590 On considère par exemple le graphe
591 $(\{1,2,3,4\},\{(1,1),(1,2),(3,1),(2,4),(3,4)\})$ dessiné sur la
592 figure~\ref{fig:g1}. Sa matrice d'adjacence est
603 Réciproquement, le graphe dont la matrice d'adjacence est
612 $ est le graphe ci-dessous~:
617 \node (1) at (0,0) {$1$};
618 \node (2) at (4,0) {$2$};
619 \node (3) at (2,-1) {$3$};
620 \node (4) at (2,1) {$4$};
621 \path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3);
622 \path[->,>=triangle 90] (2) edge[] node [above] {} (1);
623 \path[->,>=triangle 90] (3) edge[bend left] node [above] {} (1);
624 \path[->,>=triangle 90] (3) edge[] node [above] {} (2);
625 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
626 \path[->,>=triangle 90] (4) edge[] node [above] {} (2);
632 Dessiner le graphe dont la matrice d'adjacence est $\left(
633 \begin{array}{cccccc}
634 1 & 1 & 1 & 0 & 0 & 0\\
635 1 & 0 & 1 & 0 & 1 & 0\\
636 0 & 1 & 1 & 0 & 0 & 1\\
637 0 & 1 & 0 & 0 & 1 & 1\\
638 1 & 0 & 0 & 0 & 0 & 0\\
639 0 & 0 & 1 & 1 & 0 & 0\\
644 Quel est la matrice d'adjacence du graphe où $V=\{1,\ldots,7\}$ et
645 $$E=\{(1,2),(4,2),(3,5),(7,1),(6,4),(1,5),(5,0) \}~?$$
649 Soit $(V,E)$ un graphe. Comment lit-on sur la matrice d'adjacence de ce
650 graphe que la relation $E$ est réflexive~? symétrique~? antisymétrique~?
655 Pour tout graphe orienté $G$, on note $G^R$ le graphe défini par~: les
656 sommets de $G^R$ sont les mêmes que ceux de $G$ et $(x,y)$ est une arête de
657 $G^R$ si et seulement si $(y,x) $ est une arête de $G$. Le graphe $G^R$
658 s'appelle {\it miroir} de $G$.
662 \begin{tikzpicture}[scale=0.7]
663 \node (1) at (0,0) [draw,state] {$1$};
664 \node (2) at (3,0) [draw,state] {$2$};
665 \node (3) at (6,0) [draw,state] {$3$};
666 \node (4) at (9,0) [draw,state] {$4$};
667 \path[->,thick,draw] (1) -- (2);
668 \path[->,thick,draw] (2) -- (3);
669 \path[->,thick,draw] (3) edge[out=-45] node [swap] {} (4);
670 \path[->,thick,draw] (4) edge[out=-135,in=45] node [swap] {} (3);
671 \path[->,thick,draw] (1) edge[loop above] node [] {} (1);
674 \caption{}\label{fig-exo1}
678 \item Dessiner le graphe miroir du graphe de la figure~\ref{fig-exo1}.
679 \item Soit $A$ la matrice d'adjacence d'un graphe $G$. Quelle est la matrice
680 d'adjacence de $G^R$, en fonction de $A$~?
681 \item Justifier que $(G^R)^R=G$ pour tout graphe $G$.
682 \item Justifier que si $G$ contient une boucle de longueur $k$, alors $G^R$
688 \subsection{Codage par liste d'adjacence}
690 Le codage d'un graphe par liste d'adjacence consiste à coder, pour chaque
691 sommet du graphe, l'ensemble de ses voisins par une liste {\it
692 triée}\footnote{Attention, le fait qu'elle soit triée n'est pas toujours
693 imposé dans la littérature, mais c'est le choix que nous prendrons.}.
694 On considère encore que $V=\{1,\ldots,n\}$. On dispose alors d'un tableau de
695 taille $n$ dont la première case contient la liste des voisins de $1$, la
696 seconde la liste des voisins de $2$, etc.
698 Par exemple, le graphe de la figure~\ref{fig:g1} se code par le tableau de
704 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (1) at (0,0) {};
705 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (2) at (0,-0.5) {};
706 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (3) at (0,-1) {};
707 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (4) at (0,-1.5) {};
708 \node (1a) at (0,0) {};
709 \node (2a) at (0,-0.5) {};
710 \node (3a) at (0,-1) {};
711 \node (4a) at (0,-1.5) {};
714 \node (11) at (1,0) {$1$};
715 \node (12) at (2,0) {$2$};
716 \node (13) at (4,0) {NULL};
718 \node (21) at (1,-0.5) {$4$};
719 \node (22) at (3,-0.5) {NULL};
721 \node (31) at (1,-1) {$1$};
722 \node (32) at (2,-1) {$4$};
723 \node (33) at (4,-1) {NULL};
725 \node (41) at (2,-1.5) {NULL};
726 \path[->,>=triangle 90] (1a) edge[] node [above] {} (11);
727 \path[->,>=triangle 90] (11) edge[] node [above] {} (12);
728 \path[->,>=triangle 90] (12) edge[] node [above] {} (13);
730 \path[->,>=triangle 90] (2a) edge[] node [above] {} (21);
731 \path[->,>=triangle 90] (21) edge[] node [above] {} (22);
733 \path[->,>=triangle 90] (3a) edge[] node [above] {} (31);
734 \path[->,>=triangle 90] (31) edge[] node [above] {} (32);
735 \path[->,>=triangle 90] (32) edge[] node [above] {} (33);
736 \path[->,>=triangle 90] (4a) edge[] node [above] {} (41);
744 Dessiner le graphe dont la représentation par liste d'adjacence est~:
749 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (1) at (0,0) {};
750 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (2) at (0,-0.5) {};
751 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (3) at (0,-1) {};
752 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (4) at (0,-1.5) {};
753 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (5) at (0,-2) {};
754 \node[draw,minimum width=0.5cm,minimum height=0.5cm] (6) at (0,-2.5) {};
755 \node (1a) at (0,0) {};
756 \node (2a) at (0,-0.5) {};
757 \node (3a) at (0,-1) {};
758 \node (4a) at (0,-1.5) {};
759 \node (5a) at (0,-2) {};
760 \node (6a) at (0,-2.5) {};
763 \node (11) at (1,0) {$2$};
764 \node (12) at (2,0) {$5$};
765 \node (13) at (4,0) {NULL};
767 \node (21) at (1,-0.5) {$3$};
768 \node (22) at (3,-0.5) {NULL};
770 \node (31) at (1,-1) {$1$};
771 \node (32) at (2,-1) {$4$};
772 \node (33) at (3,-1) {$5$};
773 \node (34) at (4,-1) {$6$};
774 \node (35) at (6,-1) {NULL};
776 \node (41) at (1,-1.5) {$2$};
777 \node (42) at (3,-1.5) {NULL};
779 \node (51) at (2,-2) {NULL};
782 \node (61) at (1,-2.5) {$2$};
783 \node (62) at (2,-2.5) {$3$};
784 \node (63) at (3,-2.5) {$4$};
785 \node (64) at (4,-2.5) {$6$};
786 \node (65) at (6,-2.5) {NULL};
787 \path[->,>=triangle 90] (1a) edge[] node [above] {} (11);
788 \path[->,>=triangle 90] (11) edge[] node [above] {} (12);
789 \path[->,>=triangle 90] (12) edge[] node [above] {} (13);
791 \path[->,>=triangle 90] (2a) edge[] node [above] {} (21);
792 \path[->,>=triangle 90] (21) edge[] node [above] {} (22);
794 \path[->,>=triangle 90] (3a) edge[] node [above] {} (31);
795 \path[->,>=triangle 90] (31) edge[] node [above] {} (32);
796 \path[->,>=triangle 90] (32) edge[] node [above] {} (33);
797 \path[->,>=triangle 90] (33) edge[] node [above] {} (34);
798 \path[->,>=triangle 90] (34) edge[] node [above] {} (35);
801 \path[->,>=triangle 90] (4a) edge[] node [above] {} (41);
802 \path[->,>=triangle 90] (41) edge[] node [above] {} (42);
805 \path[->,>=triangle 90] (5a) edge[] node [above] {} (51);
808 \path[->,>=triangle 90] (6a) edge[] node [above] {} (61);
809 \path[->,>=triangle 90] (61) edge[] node [above] {} (62);
810 \path[->,>=triangle 90] (62) edge[] node [above] {} (63);
811 \path[->,>=triangle 90] (63) edge[] node [above] {} (64);
812 \path[->,>=triangle 90] (64) edge[] node [above] {} (65);
821 Dessiner la représentation par liste d'adjacence du graphe de la
822 figure~\ref{fig:grapheexo1}.
826 \begin{exo}\label{titi}
827 On considère que l'on code en Python un graphe par liste d'adjacence de la
830 \item Un graphe un un couple de la forme $(V,E)$,
831 \item $V$ est une liste d'éléments tous différents, triés,
832 \item $E$ est un dictionnaire qui à chaque élément de $V$ associe la liste
833 triée de ses voisins.
838 \item Dessiner le graphe correspondant à \\
839 {\tt ([1,2,3],\{1:[2],2:[2,3],3:[1,3]\})}
840 \item Écrire une fonction qui teste si un coupe $(V,E)$ où $V$ est une liste
841 d'entiers et $E$ un dictionnaire, représente bien un graphe par liste
844 \item Écrire une fonction qui compte le nombre d'arêtes d'un graphe.
846 \item Écrire une fonction qui teste si $(i,j)$ est une arête d'un graphe.
848 \item On appelle {\it sommet bloquant} un sommet $i$ tel que pour tout
849 sommet $j$, $(i,j)$ n'est pas une arête. Écrire une fonction qui teste
850 si un sommet est bloquant.
852 \item On appelle {\it sommet puits} un sommet $i$ tel que pour tout
853 sommet $j\neq i$, $(i,j)$ n'est pas une arête et tel que $(i,i)$ soit
854 une arête. Écrire une fonction qui teste
855 si un sommet est un puits.
857 \item Écrire une fonction qui ajoute une arête $(i,j)$ à un graphe.
859 \item Écrire une fonction qui supprime une arête $(i,j)$ à un graphe (on
860 rappelle que la méthode {\tt remove} de python retire la première
861 occurrence d'une valeur donnée en paramètre).
870 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
874 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
876 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
878 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
879 \chapter{Parcours de Graphes}
881 L'exercice suivant est une introduction aux parcours de graphes.
884 On considère le graphe de la figure~\ref{fig:zomb}. Il y a une flèche entre
885 $x$ et $y$ si $x$ connaît l'adresse de $y$. On considère aussi que certains
886 individus dans cette liste peuvent être des zombies.
888 \item On considère que chaque nuit, un zombie va mordre et donc transformer
889 en zombie des individus dont il connaît l'adresse et qui ne sont pas encore
890 zombies. Si c'est possible, chaque zombie transforme au moins
891 un zombie par nuit. En supposant qu'au départ seule Karina est un zombie,
892 donner quelques possibilités indiquant, in fine, qui zombifie qui?
893 Dessiner les solutions à l'aide d'un graphe où $(x,y)$ est une arête si
896 \item On considère maintenant que chaque nuit, chaque zombie va transformer
897 tous les individus dont il connaît l'adresse et qui ne sont pas encore
898 zombies. En supposant qu'au départ seule Karina est un zombie,
899 donner quelques possibilités indiquant, in fine, qui zombifie qui?
901 \item On suppose maintenant que chaque zombie doit non seulement transformer
902 tous les individus dont il connaît l'adresse et qui ne sont pas encore
903 zombies, mais aussi dans l'ordre croissant de leur numéros. Par exemple,
904 Karina transformera dans l'ordre Raph, Mike puis David. On suppose de plus
905 que chaque nuit les zombies vont mordre à tour de rôle, en commençant par
906 celui qui à été transformé en zombies le plus anciennement. En supposant
907 qu'au départ seule Karina est un zombie. Écrire qui zombifie qui, et dans
910 \item On suppose maintenant que chaque nuit, un zombie dont aucun voisin
911 (au sens des graphes)
912 n'est zombie va mordre le premier (par ordre de numéro) des individus non
913 zombies qu'il connaît qui n'est pas encore zombie. Un zombie qui a au moins
914 un voisin zombie ne fait rien la nuit, il attend. Un zombie dont tous les
915 voisins sont devenus eux aussi des zombies se transforme en poussière.
917 qu'au départ seule Karina est un zombie, Écrire qui a zombifié qui, et dans
927 \node (1) at (0,0) {Raph (1)};
928 \node (2) at (-2,-2) {Jeff (2)};
929 \node (3) at (0,-3) {Peter (3)};
930 \node (4) at (2,-2) {Chris (4)};
931 \node (5) at (0,2) {Mike (5)};
932 \node (6) at (-3,2) {Karina (6)};
933 \node (7) at (-3,0) {David (7)};
934 \node (8) at (3,0) {John-Claude (8)};
936 \path[->,>=triangle 90] (6) edge[] node [above] {} (5);
937 \path[->,>=triangle 90] (6) edge[] node [above] {} (7);
938 \path[->,>=triangle 90] (6) edge[] node [above] {} (1);
940 \path[->,>=triangle 90] (1) edge[] node [above] {} (5);
941 \path[->,>=triangle 90] (1) edge[] node [above] {} (7);
942 \path[->,>=triangle 90] (1) edge[] node [above] {} (8);
943 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
945 \path[->,>=triangle 90] (4) edge[] node [above] {} (1);
947 \path[->,>=triangle 90] (5) edge[] node [above] {} (8);
948 \path[->,>=triangle 90] (8) edge[] node [above] {} (4);
949 \path[->,>=triangle 90] (2) edge[] node [above] {} (3);
950 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
951 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
952 \path[->,>=triangle 90] (3) edge[] node [above] {} (1);
957 \caption{Graphe des connaissances}\label{fig:zomb}
962 Les graphes obtenus dans les questions de l'exercice précédent s'appellent
963 des {\it arbres couvrants}. La façon de procéder de la question~3 s'appelle
964 {\it parcours en largeur} et celle de la question~4 s'appelle {\it parcours
968 \section{Arbres couvrants}
973 Un {\bf arbre} est un graphe $G=(V,E)$ tel que~:
975 \item[(1)] Il n'y a pas de boucle de longueur non nulle dans $G$ (on dit que $G$
978 \item[(2)] Si $(x,y)$ et $(z,y)$ sont dans $E$, alors $x=z$.
980 \item[(3)] Il existe un sommet $x_0$, appelé {\bf racine}, tel que pour
981 tout sommet $y$, il existe une chemin de $x_0$ à $y$.
984 Un exemple d'arbre dont la racine est $1$ est dessiné sur la
985 figure~\ref{fig:arbre}.
988 Dessiner trois arbres différents à 6 sommets.
993 Dessiner un graphe qui vérifie $(1)$ et $(2)$ de la définition mais qui
994 n'est pas un arbre. Même question avec $(2)$ et $(3)$. Même question avec
999 Dans un arbre, on utilise à la fois une terminologie de type
1000 \og {\it végétal}\fg{} et
1002 de type \og {\it arbre généalogique}\fg{}.
1003 On appelle {\bf feuille} tout sommet d'un arbre qui n'a pas de voisin. Tout
1004 chemin de la racine à une feuille est appelée {\bf branche}. Les voisins
1005 d'un noeud sont appelés ses {\bf fils}.
1006 Tous les sommets atteignables depuis un sommet $x$ sont dits les {\bf
1007 descendants} de $x$ et ils constituent le {\bf sous-arbre} enraciné en $x$.
1008 Si $y$ est atteignable depuis $x$, alors $x$ est un {\bf ancêtre} de $y$.
1009 Si $y$ est un voisin de $x$, alors $x$ est le {\bf père} de $y$. Deux sommets
1010 qui ont le même père sont {\bf frères}.
1011 Par exemple, dans le dessin de la figure~\ref{fig:arbre},
1012 $6$ est le père de $7$, $3$ est un frère de $2$ et $5$ est une descendant de
1017 \begin{tikzpicture}[scale=0.6]
1018 \node (1) at (0,0) {$1$};
1019 \node (2) at (-3,-2) {$2$};
1020 \node (3) at (3,-2) {$3$};
1022 \node (5) at (-2,-4) {$5$};
1023 \node (4) at (-3,-4) {$4$};
1024 \node (6) at (3,-4) {$6$};
1026 \node (7) at (1,-6) {$7$};
1027 \node (8) at (2,-6) {$8$};
1028 \node (9) at (3,-6) {$9$};
1031 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
1032 \path[->,>=triangle 90] (1) edge[] node [above] {} (3);
1033 \path[->,>=triangle 90] (2) edge[] node [above] {} (5);
1034 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
1035 \path[->,>=triangle 90] (3) edge[] node [above] {} (6);
1036 \path[->,>=triangle 90] (6) edge[] node [above] {} (7);
1037 \path[->,>=triangle 90] (6) edge[] node [above] {} (8);
1038 \path[->,>=triangle 90] (6) edge[] node [above] {} (9);
1041 \caption{Exemple d'arbre}\label{fig:arbre}
1046 Dans le graphe de la figure~\ref{fig:arbre}, quels sont les descendants de
1047 $3$? Les fils de $1$? Les ancêtres de $6$? les feuilles?
1052 On considère dans cet exercice des arbres codés par liste d'adjacence comme
1053 dans l'exercice en Python de la page~\pageref{titi}. On suppose que la
1054 racine est le premier sommet de la liste $V$.
1057 \item Écrire une fonction qui compte le nombre de feuille d'un arbre.
1058 \item Écrire une fonction qui compte le nombre de descendants d'un sommet
1062 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1063 \subsection{Parcours d'arbres}
1066 Parcourir un arbre, c'est appliquer un algorithme qui va visiter, une et une
1067 seule fois chaque sommet de l'arbre. Les deux parcours les plus connus, sont
1068 les parcours préfixes et suffixes. A chaque visite de noeud, une fonction
1069 {\tt Traiter} est appliquée, selon ce que l'on souhaite faire.
1071 Le parcours Préfixe est l'algorithme récursif suivant. Initialement, le
1072 parcours est lancé à la racine.
1075 Parcours-Prefixe(V,E,x):
1077 Pour chaque fils f de x:
1078 Parcours-Prefixe(V,E,f)
1082 Si l'on applique {\tt Parcours-Prefixe} en $1$ sur l'arbre de la
1083 figure~\ref{fig:arbre}, avec pour fonction {\tt Traiter} la fonction qui
1084 affiche la valeur du sommet on obtient.
1086 $1$ {\tt Parcours-Prefixe(2)} {\tt Parcours-Prefixe(3)} \hspace{2cm} (sommets
1090 Or {\tt Parcours-Prefixe(2)} retourne
1092 $2$ {\tt Parcours-Prefixe(4)} {\tt Parcours-Prefixe(5)} \hspace{2cm} et
1099 De même {\tt Parcours-Prefixe(3)} retourne
1104 Et donc {\tt Parcours-Prefixe(1)} retourne
1106 $1$ $2$ $4$ $5$ $3$ $6$ $7$ $8$ $9$
1110 Que retourne l'algorithme de parcours préfixe sur l'arbre de la figure~\ref{fig:arbre2}.
1115 \begin{tikzpicture}[scale=0.6]
1116 \node (1) at (0,0) {$1$};
1117 \node (2) at (3,-2) {$3$};
1118 \node (3) at (-3,-2) {$2$};
1119 \node (4) at (4,-4) {$4$};
1120 \node (5) at (2,-4) {$6$};
1121 \node (6) at (-3,-4) {$5$};
1122 \node (7) at (-3,-6) {$7$};
1123 \node (8) at (-2,-6) {$8$};
1124 \node (9) at (2,-6) {$9$};
1125 \node (10) at (3,-6) {$10$};
1128 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
1129 \path[->,>=triangle 90] (1) edge[] node [above] {} (3);
1130 \path[->,>=triangle 90] (3) edge[] node [above] {} (5);
1131 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
1132 \path[->,>=triangle 90] (3) edge[] node [above] {} (6);
1133 \path[->,>=triangle 90] (6) edge[] node [above] {} (7);
1134 \path[->,>=triangle 90] (6) edge[] node [above] {} (8);
1135 \path[->,>=triangle 90] (5) edge[] node [above] {} (9);
1136 \path[->,>=triangle 90] (5) edge[] node [above] {} (10);
1139 \caption{Arbre}\label{fig:arbre2}
1145 La parcours suffixe est identique à la différence près que le traitement se
1146 fait après l'appel récursif.
1149 Parcours-Suffixe(V,E,x):
1150 Pour chaque fils f de x:
1151 Parcours-Suffixe(V,E,f)
1157 Que donne le parcours suffixe sur les arbres des figures~\ref{fig:arbre} et~\ref{fig:arbre2}?
1161 Avec le même codage que précédemment, écrire en Python des fonctions de
1162 parcours préfixe et suffixe.
1165 %%%%%%%%%%%%%%%%%%%%%
1166 \subsection{Arbres couvrants}
1168 Attention, ici, on parle d'arbres couvrants de graphes orientés.
1170 Soit $G=(V,E)$. Un arbre couvrant pour $G$, enraciné en $x\in V$, est un
1171 arbre $(V^\prime,E^\prime)$ tel que
1173 \item[(1)] $V^\prime\subseteq V$ et $E^\prime\subseteq E$.
1174 \item[(2)] $x$ est la racine de $(V^\prime,E^\prime)$.
1175 \item[(3)] On ne peut pas rajouter à l'arbre un sommet ou une arête de sorte
1177 $(1)$ et $(2)$ soient toujours vérifiées: l'arbre est maximal.
1180 Intuitivement un arbre couvrant est un arbre que l'on peut calquer sur un
1181 graphe -- conditions (1) et (2) -- sans pouvoir le prolonger.
1182 Considérons par exemple le graphe de la figure~\ref{fig:graphcouvrant}.
1186 \begin{tikzpicture}[scale = 0.8]
1187 \node (0) at (-2,-1) {0};
1189 \node (1) at (0,0) {1};
1190 \node (2) at (3,0) {2};
1191 \node (3) at (6,0) {3};
1192 \node (4) at (9,0) {4};
1193 \node (5) at (12,0) {5};
1195 \node (6) at (0,-2) {6};
1196 \node (7) at (3,-2) {7};
1197 \node (8) at (6,-2) {8};
1198 \node (9) at (9,-2) {9};
1202 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1204 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1205 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1206 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1207 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1208 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1209 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1211 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1213 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1214 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1215 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1217 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1218 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1219 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1223 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1227 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1228 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1230 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1234 \caption{Graphe 1}\label{fig:graphcouvrant}
1237 Dans ce graphe, l'arbre de gauche de la figure~\ref{fig:graphcouvrant2}
1238 vérifie bien $(1)$ et $(2)$ mais
1239 pas $(3)$. En revanche celui de droite est bien un arbre couvrant.
1245 \begin{tikzpicture}[scale = 0.8]
1246 \node (0) at (-2,-1) {0};
1248 \node (1) at (0,0) {1};
1249 \node (2) at (2,0) {2};
1250 \node (6) at (0,-2) {6};
1252 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1254 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1255 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1257 \end{tikzpicture}}\hspace{1cm}
1260 \begin{tikzpicture}[scale = 0.6]
1261 \node (0) at (-2,-1) {0};
1263 \node (1) at (0,0) {1};
1264 \node (2) at (3,0) {2};
1265 \node (3) at (6,0) {3};
1266 \node (4) at (9,0) {4};
1267 \node (5) at (12,0) {5};
1269 \node (6) at (0,-2) {6};
1270 \node (7) at (3,-2) {7};
1271 \node (9) at (9,-2) {9};
1275 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1277 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1278 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1279 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1281 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1284 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1285 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1287 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1295 \caption{Arbres non couvrant et couvrant}\label{fig:graphcouvrant2}
1299 Écrire une fonction qui étant donné un graphe et un arbre codé en Python
1300 comme précédemment, teste si l'arbre est un arbre couvrant du graphe (on ne
1301 testera pas si c'est bien un arbre).
1305 L'objectif des algorithmes de parcours de graphes est de construire des
1306 arbres couvrants de graphes afin, ensuite, d'appliquer des parcours (type
1307 préfixe/suffixe) sur les arbres obtenus. Il existe deux constructions
1308 d'arbres couvrant très utilisées, appelées {\it parcours en largeur} et {\it
1309 parcours en profondeur}.
1311 %%%%%%%%%%%%%%%%%%%%%%%%%%%
1312 \subsection{Parcours en largeur}
1315 On ne donne pas explicitement l'algorithme de parcours en largeur à partir
1317 demanderait l'introduction des structures de données. On se contente d'un
1318 pseudo-algorithme expliquant la méthode~:
1320 \item $x$ est la racine de l'arbre.
1321 \item On insère dans l'arbre tous les voisins de $x$ (sauf éventuellement
1323 \item On insère (dans l'ordre) dans l'arbre tous les voisins de la feuille
1324 la plus anciennement introduite dans l'arbre et pour laquelle c'est possible.
1325 \item On recommence l'étape précédente tant que c'est possible.
1328 Si l'on exécute le parcours sur le graphe de la
1329 figure~\ref{fig:graphcouvrant}, en partant du sommet $3$. Après les étapes
1330 $1$ et $2$ on a l'arbre $A_1$ de la figure~\ref{fig:parcourslargeur}.
1331 La feuille introduite le plus anciennement
1332 (attention à l'ordre qui est l'ordre des numéro des sommets) est $2$. On
1333 ajoute donc $1$ et $6$ -- et pas $7$ qui y est déjà. On obtient alors
1334 l'arbre $A_2$ de la figure~\ref{fig:parcourslargeur}.
1339 \begin{tikzpicture}[scale = 0.6]
1340 \node (2) at (3,0) {2};
1341 \node (3) at (6,0) {3};
1342 \node (4) at (9,0) {4};
1343 \node (5) at (12,0) {5};
1344 \node (7) at (3,-2) {7};
1348 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1349 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1350 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1351 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1355 \begin{tikzpicture}[scale = 0.6]
1357 \node (1) at (0,0) {1};
1358 \node (2) at (3,0) {2};
1359 \node (3) at (6,0) {3};
1360 \node (4) at (9,0) {4};
1361 \node (5) at (12,0) {5};
1363 \node (6) at (0,-2) {6};
1364 \node (7) at (3,-2) {7};
1368 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1369 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1372 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1373 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1374 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1375 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1383 \caption{Parcours en largeur}\label{fig:parcourslargeur}
1387 Ensuite, la feuille la plus anciennement introduite est $4$. Son seul voisin
1388 est $9$ qui n'est pas encore dans l'arbre. On obtient donc l'arbre $A_3$
1389 de la figure~\ref{fig:parcourslargeurA3}.
1390 Ensuite il s'agit du sommet $5$ dont l'unique fils $3$ est déjà dans
1391 l'arbre. La construction n'évolue donc pas pour $5$. Ensuite, on a fini les
1392 fils de $3$, on passe donc aux fils du premier fils de $3$, à savoir $2$.
1393 Les fils de $1$ sont $2$, $6$ et $7$, qui sont déjà dans l'arbre. En
1394 continuant ainsi, on voit qu'il n'y a plus rien à ajouter. On obtient donc
1395 l'arbre de la figure~\ref{fig:parcourslargeurA3}
1399 \begin{tikzpicture}[scale = 0.6]
1401 \node (1) at (0,0) {1};
1402 \node (2) at (3,0) {2};
1403 \node (3) at (6,0) {3};
1404 \node (4) at (9,0) {4};
1405 \node (5) at (12,0) {5};
1407 \node (6) at (0,-2) {6};
1408 \node (7) at (3,-2) {7};
1410 \node (9) at (9,-2) {9};
1414 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1415 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1418 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1419 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1420 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1421 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1423 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1429 \caption{Parcours en largeur~$A_3$}\label{fig:parcourslargeurA3}
1435 \item Sur le graphe de la figure ci-dessous, dessiner les arbres
1436 obtenus par un parcours en largeur à partir de $2$. Même question en partant
1437 de $6$. Même question en partant de $9$.
1440 \begin{tikzpicture}[scale = 0.8]
1441 \node (0) at (-2,-1) {0};
1443 \node (1) at (0,0) {1};
1444 \node (2) at (3,0) {2};
1445 \node (3) at (6,0) {3};
1446 \node (4) at (9,0) {4};
1447 \node (5) at (12,0) {5};
1449 \node (6) at (0,-2) {6};
1450 \node (7) at (3,-2) {7};
1451 \node (8) at (6,-2) {8};
1452 \node (9) at (9,-2) {9};
1456 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1458 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1459 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1460 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1461 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1462 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1463 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1465 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1467 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1468 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1469 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1471 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1472 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1473 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1477 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1481 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1482 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1484 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1491 \item Même question à partir de $3$, puis de $0$, puis de $8$ sur le graphe de
1492 la figure~\ref{fig:exo}.
1496 \begin{tikzpicture}[scale = 0.8]
1497 \node (0) at (-2,-1) {0};
1499 \node (1) at (0,0) {1};
1500 \node (2) at (3,0) {2};
1501 \node (3) at (6,0) {3};
1502 \node (4) at (9,0) {4};
1503 \node (5) at (12,0) {5};
1505 \node (6) at (0,-2) {6};
1506 \node (7) at (3,-2) {7};
1507 \node (8) at (6,-2) {8};
1508 \node (9) at (9,-2) {9};
1509 \node (10) at (12,-2) {10};
1511 \node (11) at (15,0) {11};
1512 \node (12) at (15,-2) {12};
1514 \node (13) at (0,-4) {13};
1515 \node (14) at (3,-4) {14};
1516 \node (15) at (6,-4) {15};
1517 \node (16) at (9,-4) {16};
1518 \node (17) at (12,-4) {17};
1519 \node (18) at (15,-4) {18};
1523 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1524 \path[->,>=triangle 90] (0) edge[] node [swap] {} (2);
1525 \path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3);
1527 \path[->,>=triangle 90] (1) edge[] node [swap] {} (2);
1528 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1529 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1530 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1531 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1533 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1535 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1536 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1537 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1539 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1540 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1541 \path[->,>=triangle 90] (5) edge[] node [swap] {} (11);
1542 \path[->,>=triangle 90] (5) edge[] node [swap] {} (12);
1543 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1547 \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
1548 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1550 \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
1551 \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
1554 \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
1556 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1557 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1558 \path[->,>=triangle 90] (8) edge[] node [swap] {} (14);
1559 \path[->,>=triangle 90] (8) edge[] node [swap] {} (15);
1561 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1562 \path[->,>=triangle 90] (9) edge[] node [swap] {} (8);
1563 \path[->,>=triangle 90] (9) edge[] node [swap] {} (16);
1565 \path[->,>=triangle 90] (10) edge[] node [swap] {} (4);
1566 \path[->,>=triangle 90] (10) edge[] node [swap] {} (5);
1567 \path[->,>=triangle 90] (10) edge[] node [swap] {} (17);
1569 \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
1571 \path[->,>=triangle 90] (13) edge[] node [swap] {} (0);
1572 \path[->,>=triangle 90] (16) edge[] node [swap] {} (17);
1573 \path[->,>=triangle 90] (17) edge[] node [swap] {} (18);
1574 \path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16);
1578 \caption{Rappel d'un graphe du chapitre 1}\label{fig:exo}
1585 Écrire en Python l'algorithme de parcours en largeur pour un graphe codé par
1591 Écrire en Python une fonction qui teste si un graphe donné par liste
1592 d'adjacence est un arbre dont la racine est le plus petit sommet.
1597 {\em composantes fortement connexes} d'un graphe sont des sous-ensembles de
1598 sommets telles que~: (1) tout sommet appartient à une composante fortement
1599 connexe, (2) s'il existe un chemin de $p$ vers $q$ et un chemin de $q$ vers
1600 $p$, alors $p$ et $q$ doivent appartenir à la même composante fortement
1601 connexe~; et réciproquement.
1603 \item Deux composantes fortement connexes sont-elles forcément
1604 disjointes? Pourquoi?
1605 \item Quels sont les composantes fortement connexes du graphe de la figure~\ref{fig:exo}.
1607 \item Décrire une méthode algorithmique pour trouver les composantes
1608 fortement connexe d'un graphe.
1614 % Comment utiliser un parcours en largeur pour trouver un chemin de taille la
1615 % plus courte possible entre deux sommets donnés?
1619 \subsection{Parcours en profondeur}
1624 \begin{tikzpicture}[scale = 0.8]
1626 \node (1) at (0,0) {1};
1627 \node (2) at (3,0) {2};
1628 \node (3) at (6,0) {3};
1629 \node (6) at (0,-2) {6};
1630 \node (9) at (9,-2) {9};
1632 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1633 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1636 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1640 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1644 \caption{Parcours en profondeur (1)}\label{fig:prof1}
1648 On ne donne pas explicitement l'algorithme de parcours en profondeur à partir
1650 demanderait l'introduction des structures de données. On se contente d'un
1651 pseudo-algorithme expliquant la méthode~:
1653 \item $x$ est la racine de l'arbre.
1654 \item On insère dans l'arbre le premier voisin de $x$ (sauf éventuellement
1656 \item On insère dans l'arbre le premier voisins du sommet
1657 le plus récemment introduit dans l'arbre et pour lequel c'est possible.
1658 \item On recommence l'étape précédente tant que c'est possible.
1661 On va appliquer la méthode sur l'arbre de la figure~\ref{fig:graphcouvrant},
1662 en partant du sommet $3$. L'arbre commence par $3$ à la racine. Puis on
1663 introduit le plus petit fils de $3$, c'est-à-dire $2$. La feuille la plus
1664 récente de l'arbre est $2$, donc on introduit le plus petit fils de $2$, à
1665 savoir $1$. A nouveau, on va introduire $6$, puis $9$. On obtient alors
1666 l'arbre de la figure~\ref{fig:prof1}.
1672 Donner les parcours en profondeur obtenus à partir de $0$, puis $8$, puis $7$
1673 sur le graphe de la figure~\ref{fig:exo}.
1676 % \begin{tikzpicture}[scale = 0.8]
1677 % \node (0) at (-2,-1) {0};
1679 % \node (1) at (0,0) {1};
1680 % \node (2) at (3,0) {2};
1681 % \node (3) at (6,0) {3};
1682 % \node (4) at (9,0) {4};
1683 % \node (5) at (12,0) {5};
1685 % \node (6) at (0,-2) {6};
1686 % \node (7) at (3,-2) {7};
1687 % \node (8) at (6,-2) {8};
1688 % \node (9) at (9,-2) {9};
1689 % \node (10) at (12,-2) {10};
1691 % \node (11) at (15,0) {11};
1692 % \node (12) at (15,-2) {12};
1694 % \node (13) at (0,-4) {13};
1695 % \node (14) at (3,-4) {14};
1696 % \node (15) at (6,-4) {15};
1697 % \node (16) at (9,-4) {16};
1698 % \node (17) at (12,-4) {17};
1699 % \node (18) at (15,-4) {18};
1703 % \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1704 % \path[->,>=triangle 90] (0) edge[] node [swap] {} (2);
1705 % \path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3);
1707 % \path[->,>=triangle 90] (1) edge[] node [swap] {} (2);
1708 % \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1709 % \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1710 % \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1711 % \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1713 % \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1715 % \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1716 % \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1717 % \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1719 % \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1720 % \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1721 % \path[->,>=triangle 90] (5) edge[] node [swap] {} (11);
1722 % \path[->,>=triangle 90] (5) edge[] node [swap] {} (12);
1723 % \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1727 % \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
1728 % \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1730 % \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
1731 % \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
1734 % \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
1736 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1737 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1738 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (14);
1739 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (15);
1741 % \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1742 % \path[->,>=triangle 90] (9) edge[] node [swap] {} (8);
1743 % \path[->,>=triangle 90] (9) edge[] node [swap] {} (16);
1745 % \path[->,>=triangle 90] (10) edge[] node [swap] {} (4);
1746 % \path[->,>=triangle 90] (10) edge[] node [swap] {} (5);
1747 % \path[->,>=triangle 90] (10) edge[] node [swap] {} (17);
1749 % \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
1751 % \path[->,>=triangle 90] (13) edge[] node [swap] {} (0);
1752 % \path[->,>=triangle 90] (16) edge[] node [swap] {} (17);
1753 % \path[->,>=triangle 90] (17) edge[] node [swap] {} (18);
1754 % \path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16);
1763 Écrire en Python l'algorithme de parcours en profondeur pour un graphe codé par
1768 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ù