]> AND Private Git Repository - cours-maths-dis.git/blob - graphes/S2MD.tex
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
t
[cours-maths-dis.git] / graphes / S2MD.tex
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}
8 \usepackage{pgf}
9 \usepackage{tikz}
10 \usepackage{pdfpages}
11 \usetikzlibrary{arrows}
12 \usetikzlibrary{automata}
13 \usetikzlibrary{snakes}
14 \usetikzlibrary{shapes}
15
16 \usepackage[hang,centerlast]{subfigure}
17
18
19
20 \newtheorem{definition}{Définition}
21 \newtheorem{theoreme}[definition]{Théorème}
22 \newtheorem{proposition}[definition]{Proposition}
23 \newtheorem{exemple}[definition]{Exemple}
24
25 \newtheorem{Exo}[definition]{Exercice}
26
27 \newenvironment{exo}
28 {\begin{Exo}{\rm }
29 {}\end{Exo}\vspace{-1em}
30 \begin{sf}}{\end{sf}}
31
32 \def \A {\mathcal{A}}
33 \def \B {\mathcal{B}}
34
35 \title{Cours Mathématiques Discrètes
36   \\IUT Belfort Montbéliard}
37 \author{{\sc Pierre-Cyrille HEAM}}
38
39
40 %%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
41
42 \begin{document}
43
44 \maketitle
45
46
47 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
48 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 \chapter{Graphes finis orientés}
52
53
54 %%%%%%%%%%%%%%%%
55 \section{Premières définitions}
56
57 Un {\bf graphe fini orienté} est un couple $(V,E)$ où 
58 \begin{itemize}
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}.
63 \end{itemize}
64
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)$.
71
72
73 \begin{exo}
74 Les couples $(V,E)$ suivants sont-ils des graphes finis orienté~?
75 \begin{enumerate}
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)\}$~?
81 \end{enumerate}
82 \end{exo}
83
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.}
87
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. 
94
95 \begin{figure}[h]
96 \begin{center}
97 \subfigure[première possibilité]{
98 \begin{tikzpicture}
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);
108 \end{tikzpicture}
109 }\hspace*{3cm}
110 \subfigure[deuxième possibilité]{
111 \begin{tikzpicture}
112
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);
122 \end{tikzpicture}
123 }
124 \end{center}
125 \caption{Représentation d'un graphe}\label{fig:g1}
126 \end{figure}
127
128
129 \begin{exo}
130 Dessiner les graphes suivants.
131 \begin{enumerate}
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)\}$.
134 \end{enumerate}
135 Donner sous forme ensembliste ($V$ et $E$) le graphe suivant~:
136
137 \begin{center}
138 \begin{tikzpicture}
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);
149 \end{tikzpicture}
150 \end{center}
151
152 Le dessin ci-dessous représente-t-il un graphe~? Si oui le donner
153 explicitement, sinon dire pourquoi.
154
155 \begin{center}
156 \begin{tikzpicture}
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);
167 \end{tikzpicture}
168 \end{center}
169
170
171 \end{exo}
172
173
174 Dans un graphe, les {\bf voisins} d'un sommet $x$ sont tous les sommets $y$
175 tels que $(x,y)$ soit dans~$E$.
176
177 \begin{exo}
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~?
180 \begin{figure}[h]
181 \begin{tikzpicture}[scale = 0.8]
182 \node (0)  at (-2,-1) {0};
183
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};
189
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};
195
196 \node (11)  at (15,0) {11};
197 \node (12)  at (15,-2) {12};
198
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};
205
206
207
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);
211
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);
217
218 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
219
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);
223
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);
229
230
231
232 \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
233 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
234
235 \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
236 \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
237
238
239 \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
240
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);
245
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);
249
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);
253
254 \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
255
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);
260
261 \end{tikzpicture}
262 \caption{Graphe 1}\label{fig:grapheexo1}
263 \end{figure}
264
265 \end{exo}
266
267
268
269 \begin{exo}
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$.
274 \end{exo}
275
276 \begin{exo}
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.
282 \end{exo}
283
284 \begin{exo}
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~?
287 réflexive~? 
288 \end{exo}
289
290
291
292 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
293 \section{Chemins, boucles et circuits}
294
295
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
304 aucune arête). 
305
306
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. 
311 Le chemin 
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
315   boucle}. 
316
317
318 \begin{exo}
319 Dans le graphe de la figure~\ref{fig:grapheexo1} donner
320 \begin{enumerate}
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$. 
325 \end{enumerate}
326 \end{exo}
327
328
329 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ùù
330 \section{Graphe et modélisation}
331
332 L'objectif de ce chapitre est de voir comment passer d'un problème concret à
333 un problème de graphe. 
334
335 \begin{exo}
336 On considère le plan ci-dessous d'un musée. La porte d'entrée est en bas à
337 gauche. 
338
339 \bigskip
340
341 \begin{tikzpicture}
342
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);
351
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);
356
357
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);
364 \end{tikzpicture}
365
366 \begin{enumerate}
367 \item Représenter sous forme de graphe ce musée, en mettant un sommet par
368   salle. 
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
371   minimum~?
372 Formuler ce problème, d'une manière générale, dans le vocabulaire des
373 graphes. 
374
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.
380
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.
386
387 \end{enumerate}
388
389 \end{exo}
390
391
392 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
393 \begin{exo}
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.
398
399 \begin{enumerate}
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
404   joueur.
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
408   ses matchs. 
409 \end{enumerate}
410 \end{exo}
411
412 \begin{exo}
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
417 de feu). 
418 Exprimer, dans le vocabulaire de la théorie des graphes les
419 propriétés suivantes.
420
421 \begin{enumerate}
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.
430 \end{enumerate}
431 \end{exo}
432
433 \begin{exo}
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
439 vraies ou fausse)~:
440 \begin{itemize}
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
444   position. 
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. 
449 \end{itemize}
450 \end{exo}
451
452
453 \begin{exo}
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
459 suivantes~:
460
461 \begin{enumerate}
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.
467 \end{enumerate}
468 \end{exo}
469
470
471 \begin{exo}
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.
477
478
479 Modéliser le problème avec un graphe et proposer une solution.
480 \end{exo}
481
482 \begin{exo}
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~:
485 \begin{enumerate}
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~?
491 \end{enumerate}
492
493 Proposer une modélisation de cette situation par un graphe, puis décrire des
494 algorithmes pour répondre aux questions posées. 
495
496 \end{exo}
497
498
499
500 \begin{figure}[t]
501 \begin{tikzpicture}
502
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);
511
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);
516
517
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);
524 \end{tikzpicture}
525 \caption{Plan du musée 1}\label{m1}
526 \end{figure}
527
528
529 \begin{exo}
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~?
536
537 \bigskip
538 Même question avec le musée de la figure~\ref{m2}.
539
540 \begin{figure}[h]
541 \begin{tikzpicture}
542
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);
551
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);
556
557
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);
564 \end{tikzpicture}
565 \caption{Plan du musée 2}\label{m2}
566 \end{figure}
567
568 \bigskip
569 Généraliser ce problème sur les graphes. Décrire un algorithme pour le
570 résoudre~?
571 \end{exo}
572
573
574 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
575 \section{Codage des graphes}
576
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.
580
581
582 \subsection{Codage par matrices d'adjacence}
583
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$. 
589
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 
593 $$\left(
594 \begin{array}{cccc}
595 1 & 1 & 0 & 0\\
596 0 & 0 & 0 & 1\\
597 1 & 0 & 0 & 1\\
598 0 & 0 & 0 & 0 
599 \end{array}
600 \right).
601 $$
602
603 Réciproquement, le graphe dont la matrice d'adjacence est 
604 $\left(
605 \begin{array}{cccc}
606 0 & 0 & 1 & 0\\
607 1 & 0 & 0 & 0\\
608 1 & 1 & 0 & 1\\
609 0 & 1 & 0 & 0 
610 \end{array}
611 \right)
612 $ est le graphe ci-dessous~:
613 \bigskip
614
615 \begin{center}
616 \begin{tikzpicture}
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);
627 \end{tikzpicture}
628 \end{center}
629
630
631 \begin{exo}
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\\ 
640 \end{array}
641 \right)$.
642
643 \noindent
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) \}~?$$
646 \end{exo}
647
648 \begin{exo}
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~?
651 \end{exo}
652
653
654 \begin{exo}
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$. 
659
660 \begin{figure}[h]
661 \begin{center}
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);
672 \end{tikzpicture}
673 \end{center}
674 \caption{}\label{fig-exo1}
675 \end{figure}
676
677 \begin{enumerate}
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$
683   aussi. 
684 \end{enumerate}
685
686 \end{exo}
687
688 \subsection{Codage par liste d'adjacence}
689
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. 
697
698 Par exemple, le graphe de la figure~\ref{fig:g1} se code par le tableau de
699 liste~:
700
701 \medskip
702 \begin{center}
703 \begin{tikzpicture}
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) {};
712
713
714 \node  (11) at (1,0) {$1$};
715 \node  (12) at (2,0) {$2$};
716 \node  (13) at (4,0) {NULL};
717
718 \node  (21) at (1,-0.5) {$4$};
719 \node  (22) at (3,-0.5) {NULL};
720
721 \node  (31) at (1,-1) {$1$};
722 \node  (32) at (2,-1) {$4$};
723 \node  (33) at (4,-1) {NULL};
724
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);
729
730 \path[->,>=triangle 90] (2a) edge[] node [above] {} (21);
731 \path[->,>=triangle 90] (21) edge[] node [above] {} (22);
732
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);
737
738
739 \end{tikzpicture}
740 \end{center}
741
742
743 \begin{exo}
744 Dessiner le graphe dont la représentation par liste d'adjacence est~:
745
746 \medskip
747 \begin{center}
748 \begin{tikzpicture}
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) {};
761
762
763 \node  (11) at (1,0) {$2$};
764 \node  (12) at (2,0) {$5$};
765 \node  (13) at (4,0) {NULL};
766
767 \node  (21) at (1,-0.5) {$3$};
768 \node  (22) at (3,-0.5) {NULL};
769
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};
775
776 \node  (41) at (1,-1.5) {$2$};
777 \node  (42) at (3,-1.5) {NULL};
778
779 \node  (51) at (2,-2) {NULL};
780
781
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);
790
791 \path[->,>=triangle 90] (2a) edge[] node [above] {} (21);
792 \path[->,>=triangle 90] (21) edge[] node [above] {} (22);
793
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);
799
800
801 \path[->,>=triangle 90] (4a) edge[] node [above] {} (41);
802 \path[->,>=triangle 90] (41) edge[] node [above] {} (42);
803
804
805 \path[->,>=triangle 90] (5a) edge[] node [above] {} (51);
806
807
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);
813
814 \end{tikzpicture}
815 \end{center}
816
817
818 \end{exo}
819
820 \begin{exo}
821 Dessiner la représentation par liste d'adjacence du graphe de la
822 figure~\ref{fig:grapheexo1}.
823 \end{exo}
824
825
826 \begin{exo}\label{titi}
827 On considère que l'on code en Python un graphe par liste d'adjacence de la
828 manière suivante~:
829 \begin{itemize}
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.
834 \end{itemize}
835
836
837 \begin{enumerate}
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
842   d'adjacence. 
843
844 \item Écrire une fonction qui compte le nombre d'arêtes d'un graphe.
845
846 \item Écrire une fonction qui teste si $(i,j)$ est une arête d'un graphe. 
847
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.
851
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.
856
857 \item Écrire une fonction qui ajoute une arête $(i,j)$ à un graphe. 
858
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).
862
863 \end{enumerate}
864  
865 \end{exo}
866
867
868
869
870 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
871
872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
873
874 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
875
876 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
877
878 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
879 \chapter{Parcours de Graphes}
880
881 L'exercice suivant est une introduction aux parcours de graphes. 
882
883 \begin{exo}
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. 
887 \begin{enumerate}
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
894   $x$ a zombifié $y$. 
895
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?
900
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
908   quel ordre.  
909
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. 
916  En supposant
917   qu'au départ seule Karina est un zombie, Écrire qui a zombifié qui, et dans
918   quel ordre.  
919
920
921 \end{enumerate}
922
923 \begin{figure}[h]
924 \begin{center}
925 \begin{tikzpicture}
926
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)};
935
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);
939
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);
944
945 \path[->,>=triangle 90] (4) edge[] node [above] {}  (1);
946
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);
953
954
955 \end{tikzpicture}
956 \end{center}
957 \caption{Graphe des connaissances}\label{fig:zomb}
958 \end{figure}
959 \end{exo}
960
961
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
965   en profondeur}. 
966
967
968 \section{Arbres couvrants}
969
970 \subsection{Arbres}
971
972
973 Un {\bf arbre} est un graphe $G=(V,E)$ tel que~:
974 \begin{enumerate}
975 \item[(1)] Il n'y a pas de boucle de longueur non nulle dans $G$ (on dit que $G$
976   est acyclique).
977
978 \item[(2)] Si $(x,y)$ et $(z,y)$ sont dans $E$, alors $x=z$. 
979
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$.
982 \end{enumerate}
983
984 Un exemple d'arbre dont la racine est $1$ est dessiné sur la
985 figure~\ref{fig:arbre}.
986
987 \begin{exo}
988 Dessiner trois arbres différents à 6 sommets.
989 \end{exo}
990
991
992 \begin{exo}
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
995 $(3)$ et $(1)$.
996 \end{exo}
997
998 \medskip
999 Dans un arbre, on utilise à la fois une terminologie de type 
1000 \og {\it végétal}\fg{} et
1001 aussi
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
1013 $1$.  
1014
1015 \begin{figure}
1016 \begin{center}
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$};
1021
1022 \node (5) at (-2,-4) {$5$};
1023 \node (4) at (-3,-4) {$4$};
1024 \node (6) at (3,-4) {$6$};
1025
1026 \node (7) at (1,-6) {$7$};
1027 \node (8) at (2,-6) {$8$};
1028 \node (9) at (3,-6) {$9$};
1029
1030
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);
1039 \end{tikzpicture}
1040 \end{center}
1041 \caption{Exemple d'arbre}\label{fig:arbre}
1042 \end{figure}
1043
1044
1045 \begin{exo}
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?
1048 \end{exo}
1049
1050
1051 \begin{exo}
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$.
1055
1056 \begin{enumerate}
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
1059   donné. 
1060 \end{enumerate}
1061 \end{exo}
1062 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1063 \subsection{Parcours d'arbres}
1064
1065
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. 
1070
1071 Le parcours Préfixe est l'algorithme récursif suivant. Initialement, le
1072 parcours est lancé à la racine. 
1073
1074 \begin{verbatim}
1075 Parcours-Prefixe(V,E,x):
1076    Traiter(x)
1077    Pour chaque fils f de x:
1078       Parcours-Prefixe(V,E,f)
1079    FinPour
1080 \end{verbatim}
1081
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. 
1085
1086 $1$ {\tt Parcours-Prefixe(2)} {\tt Parcours-Prefixe(3)} \hspace{2cm} (sommets
1087 dans l'ordre)
1088
1089 \noindent
1090 Or {\tt Parcours-Prefixe(2)} retourne
1091
1092 $2$ {\tt Parcours-Prefixe(4)} {\tt Parcours-Prefixe(5)} \hspace{2cm}  et
1093 donc retourne 
1094
1095 $2$ $4$ $5$
1096
1097
1098 \noindent
1099 De même  {\tt Parcours-Prefixe(3)} retourne
1100
1101 $3$ $6$ $7$ $8$ $9$
1102
1103 \noindent
1104 Et donc  {\tt Parcours-Prefixe(1)} retourne
1105
1106 $1$ $2$ $4$ $5$ $3$ $6$ $7$ $8$ $9$
1107
1108
1109 \begin{exo}
1110 Que retourne l'algorithme de parcours préfixe sur l'arbre de la figure~\ref{fig:arbre2}.
1111
1112
1113 \begin{figure}
1114 \begin{center}
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$};
1126
1127
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);
1137 \end{tikzpicture}
1138 \end{center}
1139 \caption{Arbre}\label{fig:arbre2}
1140 \end{figure}
1141
1142 \end{exo}
1143
1144 \medskip
1145 La parcours suffixe est identique à la différence près que le traitement se
1146 fait après l'appel récursif. 
1147
1148 \begin{verbatim}
1149 Parcours-Suffixe(V,E,x):
1150    Pour chaque fils f de x:
1151       Parcours-Suffixe(V,E,f)
1152    FinPour
1153    Traiter(x)
1154 \end{verbatim}
1155
1156 \begin{exo}
1157 Que donne le parcours suffixe sur les arbres des figures~\ref{fig:arbre} et~\ref{fig:arbre2}?
1158 \end{exo}
1159
1160 \begin{exo}
1161 Avec le même codage que précédemment, écrire en Python des fonctions de
1162 parcours préfixe et suffixe.
1163 \end{exo}
1164
1165 %%%%%%%%%%%%%%%%%%%%%
1166 \subsection{Arbres couvrants}
1167
1168 Attention, ici, on parle d'arbres couvrants de graphes orientés.
1169
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
1172 \begin{enumerate}
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 
1176   que les conditions 
1177   $(1)$ et $(2)$ soient toujours vérifiées: l'arbre est maximal. 
1178 \end{enumerate}
1179
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}.
1183
1184 \begin{figure}[h]
1185 \begin{center}
1186 \begin{tikzpicture}[scale = 0.8]
1187 \node (0)  at (-2,-1) {0};
1188
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};
1194
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};
1199
1200
1201
1202 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1203
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);
1210
1211 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1212
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);
1216
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);
1220
1221
1222
1223 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1224
1225
1226
1227 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1228 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1229
1230 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1231
1232 \end{tikzpicture}
1233 \end{center}
1234 \caption{Graphe 1}\label{fig:graphcouvrant}
1235 \end{figure}
1236
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. 
1240
1241
1242 \begin{figure}[h]
1243 \begin{center}
1244 \subfigure{
1245 \begin{tikzpicture}[scale = 0.8]
1246 \node (0)  at (-2,-1) {0};
1247
1248 \node (1)  at (0,0) {1};
1249 \node (2) at (2,0) {2};
1250 \node (6) at (0,-2) {6};
1251
1252 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1253
1254 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1255 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1256
1257 \end{tikzpicture}}\hspace{1cm}
1258 \subfigure{
1259
1260 \begin{tikzpicture}[scale = 0.6]
1261 \node (0)  at (-2,-1) {0};
1262
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};
1268
1269 \node (6) at (0,-2) {6};
1270 \node (7) at (3,-2) {7};
1271 \node (9) at (9,-2) {9};
1272
1273
1274
1275 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1276
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);
1280
1281 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1282
1283
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);
1286
1287 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1288
1289
1290
1291 \end{tikzpicture}
1292 }
1293 \end{center}
1294
1295 \caption{Arbres non couvrant et couvrant}\label{fig:graphcouvrant2}
1296 \end{figure}
1297
1298 \begin{exo}
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). 
1302 \end{exo}
1303
1304
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}. 
1310
1311 %%%%%%%%%%%%%%%%%%%%%%%%%%%
1312 \subsection{Parcours en largeur}
1313
1314
1315 On ne donne pas explicitement l'algorithme de parcours en largeur à partir
1316 de $x$ qui
1317 demanderait l'introduction des structures de données. On se contente d'un
1318 pseudo-algorithme expliquant la méthode~:
1319 \begin{enumerate}
1320 \item $x$ est la racine de l'arbre.
1321 \item On insère dans l'arbre tous les voisins de $x$ (sauf éventuellement
1322   $x$), dans l'ordre. 
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. 
1326 \end{enumerate}
1327
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}.
1335
1336 \begin{figure}[h]
1337 \begin{center}
1338 \subfigure[$A_1$]{
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};
1345
1346
1347
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);
1352 \end{tikzpicture}
1353 }
1354 \subfigure[$A_2$]{
1355 \begin{tikzpicture}[scale = 0.6]
1356
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};
1362
1363 \node (6) at (0,-2) {6};
1364 \node (7) at (3,-2) {7};
1365
1366
1367
1368 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1369 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1370
1371
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);
1376
1377
1378
1379
1380 \end{tikzpicture}
1381 }
1382 \end{center}
1383 \caption{Parcours en largeur}\label{fig:parcourslargeur}
1384 \end{figure}
1385
1386
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}
1396
1397 \begin{figure}[ht]
1398 \begin{center}
1399 \begin{tikzpicture}[scale = 0.6]
1400
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};
1406
1407 \node (6) at (0,-2) {6};
1408 \node (7) at (3,-2) {7};
1409
1410 \node (9) at (9,-2) {9};
1411
1412
1413
1414 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1415 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1416
1417
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);
1422
1423 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1424
1425
1426
1427 \end{tikzpicture}
1428 \end{center}
1429 \caption{Parcours en largeur~$A_3$}\label{fig:parcourslargeurA3}
1430 \end{figure}
1431
1432
1433 \begin{exo}
1434 \begin{enumerate}
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$. 
1438
1439 \begin{center}
1440 \begin{tikzpicture}[scale = 0.8]
1441 \node (0)  at (-2,-1) {0};
1442
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};
1448
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};
1453
1454
1455
1456 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1457
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);
1464
1465 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1466
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);
1470
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);
1474
1475
1476
1477 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1478
1479
1480
1481 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1482 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1483
1484 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1485
1486
1487 \end{tikzpicture}
1488 \end{center}
1489
1490
1491 \item Même question à partir de $3$, puis de $0$, puis de $8$ sur le graphe de
1492 la figure~\ref{fig:exo}.
1493
1494 \begin{figure}[h]
1495 \begin{center}
1496 \begin{tikzpicture}[scale = 0.8]
1497 \node (0)  at (-2,-1) {0};
1498
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};
1504
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};
1510
1511 \node (11)  at (15,0) {11};
1512 \node (12)  at (15,-2) {12};
1513
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};
1520
1521
1522
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);
1526
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);
1532
1533 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1534
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);
1538
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);
1544
1545
1546
1547 \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
1548 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1549
1550 \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
1551 \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
1552
1553
1554 \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
1555
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);
1560
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);
1564
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);
1568
1569 \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
1570
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);
1575
1576 \end{tikzpicture}
1577 \end{center}
1578 \caption{Rappel d'un graphe du chapitre 1}\label{fig:exo}
1579 \end{figure}
1580 \end{enumerate}
1581 \end{exo}
1582
1583
1584 \begin{exo}
1585 Écrire en Python l'algorithme de parcours en largeur pour un graphe codé par
1586 liste d'adjacence. 
1587 \end{exo}
1588
1589
1590 \begin{exo}
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. 
1593 \end{exo}
1594
1595 \begin{exo} 
1596 Les
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.  
1602 \begin{enumerate}
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}.
1606
1607 \item Décrire une méthode algorithmique pour trouver les composantes
1608   fortement connexe d'un graphe. 
1609 \end{enumerate}
1610 \end{exo}
1611
1612
1613 % \begin{exo}
1614 % Comment utiliser un parcours en largeur pour trouver un chemin de taille la
1615 % plus courte possible entre deux sommets donnés?
1616 % \end{exo}
1617
1618 %%%%%%%%%%%%%%%
1619 \subsection{Parcours en profondeur}
1620
1621
1622 \begin{figure}
1623 \begin{center}
1624 \begin{tikzpicture}[scale = 0.8]
1625
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};
1631
1632 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1633 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1634
1635
1636 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1637
1638
1639
1640 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1641
1642 \end{tikzpicture}
1643 \end{center}
1644 \caption{Parcours en profondeur (1)}\label{fig:prof1}
1645 \end{figure}
1646
1647
1648 On ne donne pas explicitement l'algorithme de parcours en profondeur à partir
1649 de $x$ qui
1650 demanderait l'introduction des structures de données. On se contente d'un
1651 pseudo-algorithme expliquant la méthode~:
1652 \begin{enumerate}
1653 \item $x$ est la racine de l'arbre.
1654 \item On insère dans l'arbre le premier voisin de $x$ (sauf éventuellement
1655   $x$). 
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. 
1659 \end{enumerate}
1660
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}.  
1667
1668
1669
1670 \pagebreak[3]
1671 \begin{exo}
1672 Donner les parcours en profondeur obtenus à partir de $0$, puis $8$, puis $7$
1673 sur le graphe de la figure~\ref{fig:exo}.
1674
1675
1676 % \begin{tikzpicture}[scale = 0.8]
1677 % \node (0)  at (-2,-1) {0};
1678
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};
1684
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};
1690
1691 % \node (11)  at (15,0) {11};
1692 % \node (12)  at (15,-2) {12};
1693
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};
1700
1701
1702
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);
1706
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);
1712
1713 % \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1714
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);
1718
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);
1724
1725
1726
1727 % \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
1728 % \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1729
1730 % \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
1731 % \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
1732
1733
1734 % \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
1735
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);
1740
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);
1744
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);
1748
1749 % \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
1750
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);
1755
1756 % \end{tikzpicture}
1757
1758 \end{exo}
1759
1760
1761
1762 \begin{exo}
1763 Écrire en Python l'algorithme de parcours en profondeur pour un graphe codé par
1764 liste d'adjacence. 
1765 \end{exo}
1766
1767
1768 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ù
1769 \input{automates}
1770
1771 \end{document}