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

Private GIT Repository
ajout fichier pch
[cours-maths-dis.git] / graphes / S2MD.tex
1 \documentclass[]{report}
2 \usepackage[a4paper]{geometry}
3 \geometry{hmargin=1.5cm, vmargin=1.5cm }
4 \usepackage[latin1]{inputenc}
5 \usepackage[T1]{fontenc} 
6 \usepackage[french]{babel}
7 \usepackage{amsmath,amssymb,latexsym,eufrak,euscript,array}
8
9
10 \usepackage{pgf}
11 \usepackage{tikz}
12 \usepackage{pdfpages}
13 \usetikzlibrary{arrows}
14 \usetikzlibrary{automata}
15 \usetikzlibrary{snakes}
16 \usetikzlibrary{shapes}
17
18 \usepackage[hang,centerlast]{subfigure}
19
20
21
22 \newtheorem{definition}{Definition}
23 \newtheorem{theoreme}[definition]{Théorème}
24 \newtheorem{proposition}[definition]{Proposition}
25 \newtheorem{exemple}[definition]{Exemple}
26
27 \newtheorem{Exo}[definition]{Exercice}
28
29 \newenvironment{exo}
30 {\begin{Exo}{\rm }
31 {}\end{Exo}\vspace{-1em}
32 \begin{sf}}{\end{sf}}
33
34 \def \A {\mathcal{A}}
35 \def \B {\mathcal{B}}
36
37 \title{Cours Mathématiques Discrètes
38   \\IUT Belfort Montbéliard}
39 \author{{\sc Pierre-Cyrille HEAM}}
40
41
42 %%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43
44 \begin{document}
45
46 \maketitle
47
48
49 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
50 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
53 \chapter{Graphes finis orientés}
54
55
56 %%%%%%%%%%%%%%%%
57 \section{Premières définitions}
58
59 Un {\bf graphe fini orienté} est un couple $(V,E)$ où 
60 \begin{itemize}
61 \item $V$ est un ensemble fini dont les éléments sont appelés {\bf sommets}
62   ou {\bf noeuds} ou {\bf états}.
63 \item $E\subseteq V\times V$ est un ensemble de couples d'éléments de $V$,
64   appelés {\bf arêtes} ou {\bf transitions}.
65 \end{itemize}
66
67 Par exemple $\left(\{1,2,3\},\{(1,2),(2,2),(3,1)\}\right)$ est un graphe
68 fini orienté. Le choix des lettres $V$ et $E$ viennent de l'anglais pour
69 {\it vertice} et {\it edge}. On rappelle que dans un ensemble (entre $\{\}$)
70 les éléments ne sont pas ordonnés et n'apparaissent qu'au plus une fois. En
71 revanche dans un couple (deux éléments entre parenthèse), les éléments sont
72 ordonnés. Le couple $(1,2)$ est différent du couple $(2,1)$.
73
74
75 \begin{exo}
76 Les couples $(V,E)$ suivants sont-ils des graphes finis orienté~?
77 \begin{enumerate}
78 \item $V=\{1,2,3\}$ et $E=\{(1,3)\}$~?
79 \item $V=\{1,2,3\}$ et $E=\{(1,6),(2,4)\}$~?
80 \item $V=\{1,2,3\}$ et $\emptyset$~?
81 \item $V=\{1,2,3\}$ et $E=\{\{1,3\}\}$~?
82 \item $V=\mathbb{N}$ et $E=\{(1,3)\}$~?
83 \end{enumerate}
84 \end{exo}
85
86 {\bf Sauf mention contraire, tous les graphes étudiés dans ce polycopié
87   seront des graphes finis orientés, que nous appellerons simplement {\it
88     graphes} par la suite.}
89
90 Un graphe se représente souvent par un dessin où les sommets sont des points
91 (parfois entourés d'un cercle) et les arêtes des flèches~: si $(x,y)$ est
92 une arête, on dessine une flèche entre $x$ et $y$. Par exemple le graphe
93 $$(\{1,2,3,4\},\{(1,1),(1,2),(3,1),(2,4),(3,4)\})$$ peut se dessiner comme sur la
94 figure~\ref{fig:g1}. Comme on peut le voir, il n'y a pas unicité de la façon
95 de dessiner un graphe. 
96
97 \begin{figure}[h]
98 \begin{center}
99 \subfigure[première possibilité]{
100 \begin{tikzpicture}
101 \node (1) at (0,0) {$1$};
102 \node (2) at (4,0) {$2$};
103 \node (3) at (2,-0.7) {$3$};
104 \node (4) at (2,0.7) {$4$};
105 \path[->,>=triangle 90] (1) edge[loop above] node [above] {} ();
106 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
107 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
108 \path[->,>=triangle 90] (3) edge[] node [above] {} (1);
109 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
110 \end{tikzpicture}
111 }\hspace*{3cm}
112 \subfigure[deuxième possibilité]{
113 \begin{tikzpicture}
114
115 \node (1) at (0,0) {$1$};
116 \node (2) at (3,0) {$2$};
117 \node (3) at (2,-0.7) {$3$};
118 \node (4) at (5,-0.7) {$4$};
119 \path[->,>=triangle 90] (1) edge[loop above] node [above] {} ();
120 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
121 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
122 \path[->,>=triangle 90] (3) edge[] node [above] {} (1);
123 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
124 \end{tikzpicture}
125 }
126 \end{center}
127 \caption{Représentation d'un graphe}\label{fig:g1}
128 \end{figure}
129
130
131 \begin{exo}
132 Dessiner les graphes suivants.
133 \begin{enumerate}
134 \item $V=\{1,2,3,4,5\}$ et $E=\{(1,2),(2,1),(3,4),(4,4),(4,5),(5,3)\}$.
135 \item $V=\{1,2,3,4,5\}$ et $E=\{(1,4),(4,1),(3,4),(4,4),(4,5),(5,3)\}$.
136 \end{enumerate}
137 Donner sous forme ensembliste ($V$ et $E$) le graphe suivant~:
138
139 \begin{center}
140 \begin{tikzpicture}
141 \node (1) at (0,0) {$1$};
142 \node (2) at (4,0) {$2$};
143 \node (3) at (2,-1) {$3$};
144 \node (4) at (2,1) {$4$};
145 \path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3);
146 \path[->,>=triangle 90] (2) edge[] node [above] {} (1);
147 \path[->,>=triangle 90] (3) edge[bend left] node [above] {} (1);
148 \path[->,>=triangle 90] (3) edge[] node [above] {} (2);
149 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
150 \path[->,>=triangle 90] (4) edge[] node [above] {} (2);
151 \end{tikzpicture}
152 \end{center}
153
154 Le dessin ci-dessous représente-t-il un graphe~? Si oui le donner
155 explicitement, sinon dire pourquoi.
156
157 \begin{center}
158 \begin{tikzpicture}
159 \node (1) at (0,0) {$1$};
160 \node (2) at (4,0) {$2$};
161 \node (3) at (2,-1) {$3$};
162 \node (4) at (2,1) {$4$};
163 \path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3);
164 \path[->,>=triangle 90] (2) edge[] node [above] {} (1);
165 \path[->,>=triangle 90] (1) edge[bend right] node [above] {} (3);
166 \path[->,>=triangle 90] (3) edge[] node [above] {} (2);
167 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
168 \path[->,>=triangle 90] (4) edge[] node [above] {} (2);
169 \end{tikzpicture}
170 \end{center}
171
172
173 \end{exo}
174
175
176 Dans un graphe, les {\bf voisins} d'un sommet $x$ sont tous les sommets $y$
177 tels que $(x,y)$ soit dans~$E$.
178
179 \begin{exo}
180 Pour le graphe de la figure~\ref{fig:grapheexo1}, quels
181 sont les voisins de $3$~? de $7$~? Quels sommets ont $9$ pour voisin~?
182 \begin{figure}[h]
183 \begin{tikzpicture}[scale = 0.8]
184 \node (0)  at (-2,-1) {0};
185
186 \node (1)  at (0,0) {1};
187 \node (2) at (3,0) {2};
188 \node (3)  at (6,0) {3};
189 \node (4) at (9,0) {4};
190 \node (5)  at (12,0) {5};
191
192 \node (6) at (0,-2) {6};
193 \node (7) at (3,-2) {7};
194 \node (8) at (6,-2) {8};
195 \node (9) at (9,-2) {9};
196 \node (10) at (12,-2) {10};
197
198 \node (11)  at (15,0) {11};
199 \node (12)  at (15,-2) {12};
200
201 \node (13)  at (0,-4) {13};
202 \node (14)  at (3,-4) {14};
203 \node (15)  at (6,-4) {15};
204 \node (16)  at (9,-4) {16};
205 \node (17)  at (12,-4) {17};
206 \node (18)  at (15,-4) {18};
207
208
209
210 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
211 \path[->,>=triangle 90] (0) edge[] node [swap] {} (2);
212 \path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3);
213
214 \path[->,>=triangle 90] (1) edge[] node [swap] {} (2);
215 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
216 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
217 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
218 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
219
220 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
221
222 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
223 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
224 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
225
226 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
227 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
228 \path[->,>=triangle 90] (5) edge[] node [swap] {} (11);
229 \path[->,>=triangle 90] (5) edge[] node [swap] {} (12);
230 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
231
232
233
234 \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
235 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
236
237 \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
238 \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
239
240
241 \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
242
243 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
244 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
245 \path[->,>=triangle 90] (8) edge[] node [swap] {} (14);
246 \path[->,>=triangle 90] (8) edge[] node [swap] {} (15);
247
248 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
249 \path[->,>=triangle 90] (9) edge[] node [swap] {} (8);
250 \path[->,>=triangle 90] (9) edge[] node [swap] {} (16);
251
252 \path[->,>=triangle 90] (10) edge[] node [swap] {} (4);
253 \path[->,>=triangle 90] (10) edge[] node [swap] {} (5);
254 \path[->,>=triangle 90] (10) edge[] node [swap] {} (17);
255
256 \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
257
258 \path[->,>=triangle 90] (13) edge[] node [swap] {} (0);
259 \path[->,>=triangle 90] (16) edge[] node [swap] {} (17);
260 \path[->,>=triangle 90] (17) edge[] node [swap] {} (18);
261 \path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16);
262
263 \end{tikzpicture}
264 \caption{Graphe 1}\label{fig:grapheexo1}
265 \end{figure}
266
267 \end{exo}
268
269
270
271 \begin{exo}
272 On considère la fonction $f$ de $\{0,\ldots,7\}$ dans $\{0,\ldots,7\}$ qui à
273 $x$ associe son reste modulo $3$. Dessiner le graphe où $V=\{0,\ldots,7\}$ et
274 $(x,y)\in E$ si et seulement si $y=f(x)$. Mêmes question avec $(x,y)\in E$
275 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$.
276 \end{exo}
277
278 \begin{exo}
279 On considère $V=\{maison, voiture, poisson, porte, cartable, grue\}$ et
280 $(x,y)\in E$ si et seulement $x$ est avant $y$ dans l'ordre du dictionnaire. 
281 Dessiner le graphe $(V,E)$.
282 Même question mais cette fois ci $(x,y)\in E$ si et seulement $x$ et
283 $y$ ont au moins deux lettres en commun.
284 \end{exo}
285
286 \begin{exo}
287 Soit $G=(V,E)$ un graphe. Comment voit-on sur un dessin de $G$ que la relation
288 $E$ est une application bijective~? que la relation $E$ est transitive~?
289 réflexive~? 
290 \end{exo}
291
292
293
294 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
295 \section{Chemins, boucles et circuits}
296
297
298 Soit $G=(V,E)$ un graphe. Un {\bf chemin} est une suite finie
299 $(x_1,x_2),(x_2,x_3),\ldots,(x_{n},x_{n+1})$ d'arêtes consécutives. L'entier
300 $n$ est appelé {\bf taille} ou {\bf longueur} du chemin. Le sommet $x_1$ est l'{\bf origine}
301 du chemin et $x_n$ sa {\bf destination}. On dit aussi que ce chemin part de
302 $x_1$ pour arriver en $x_n$.  
303 Dans le graphe de la figure~\ref{fig:grapheexo1}, $(0,1),(1,2),(2,6)$ est un
304 chemin partant de $0$, arrivant en $6$ et de longueur $3$. Par convention,
305 de tout point part un chemin vers lui même de longueur $0$ (qui n'utilise
306 aucune arête). 
307
308
309 Une {\bf boucle} est un chemin dont le sommet d'origine est aussi le sommet
310 d'arrivée. Une boucle qui ne passe pas deux fois par le même sommet (sauf à
311 l'origine et à la destination) est appelé un {\bf circuit}. Dans le graphe
312 de la figure~\ref{fig:grapheexo1}, $(5,12),(12,10),(10,5)$ est un circuit. 
313 Le chemin 
314 $$(0,1),(1,7)(7,13)(13,0),(0,3),(3,7),(7,13),(13,0)$$
315 est une boucle mais n'est pas un circuit. 
316 Un chemin qui ne passe jamais deux fois par le même sommet est dit {\bf sans
317   boucle}. 
318
319
320 \begin{exo}
321 Dans le graphe de la figure~\ref{fig:grapheexo1} donner
322 \begin{enumerate}
323 \item Un circuit de taille $1$,
324 \item Une boucle de longueur $9$ passant par $4$,
325 \item Un chemin sans boucle de $0$ à $18$,
326 \item Un chemin sans boucle de taille au moins $10$. 
327 \end{enumerate}
328 \end{exo}
329
330
331 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ùù
332 \section{Graphe et modélisation}
333
334 L'objectif de ce chapitre est de voir comment passer d'un problème concret à
335 un problème de graphe. 
336
337 \begin{exo}
338 On considère le plan ci-dessous d'un musée. La porte d'entrée est en bas à
339 gauche. 
340
341 \bigskip
342
343 \begin{tikzpicture}
344
345 \draw (0,0) rectangle +(6,4);
346 \draw (0,0) rectangle +(1.5,1);
347 \draw (0,0) rectangle +(1.5,2);
348 \draw (0,0) rectangle +(1.5,3);
349 \draw (0,0) rectangle +(1.5,4);
350 \draw (1.5,2) rectangle +(1.5,2);
351 \draw (1.5,1) rectangle +(3,3);
352 \draw (0,0) rectangle +(4.5,1);
353
354 \draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ;
355 \draw (0.5,0.9) [fill=white]rectangle +(0.5,.2);
356 \draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2);
357 \draw (2,1-0.1) [fill=white]rectangle +(0.5,.2);
358
359
360 \draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
361 \draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
362 \draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
363 \draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5);
364 \draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5);
365 \draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
366 \end{tikzpicture}
367
368 \begin{enumerate}
369 \item Représenter sous forme de graphe ce musée, en mettant un sommet par
370   salle. 
371 \item On suppose qu'un gardien peut surveiller la salle dans laquelle il se
372   trouve ainsi que les salles voisines. Combien faut-il de gardiens au
373   minimum~?
374 Formuler ce problème, d'une manière générale, dans le vocabulaire des
375 graphes. 
376
377 \item Un groupe de visiteurs souhaite admirer toutes les salles du musée. 
378 Peut-il le faire sans jamais passer deux fois par la même salle (on ne
379 compte pas le chemin de retour; le groupe peut partir de n'importe quelle
380 salle aussi)~? Proposer une formulation générale de ce
381 problème en utilisant le vocabulaire des graphes.
382
383 \item Le soir, le conservateur souhaite avant de fermer le musée passer dans
384   toutes les salles puis ressortir, tout en minimisant le trajet (il part de
385   l'entrée et ressort par l'entrée/sortie). Quel
386   chemin doit-il prendre~? Formuler ce problème de façon général en
387   utilisant le vocabulaire des graphes.
388
389 \end{enumerate}
390
391 \end{exo}
392
393
394 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
395 \begin{exo}
396 On considère un ensemble fini $V$ de joueurs de tennis, et le graphe orienté
397 $(V,E)$ tel que $(x,y)\in E$ si et seulement si $x$ a déjà gagné un match
398 contre $y$. Donner des formulations dans le vocabulaire de la théorie des
399 graphes des propriétés suivantes.
400
401 \begin{enumerate}
402 \item Il y a un joueur qui n'a jamais perdu.
403 \item Il y a un joueur qui n'a jamais gagné.
404 \item Un joueur ne joue jamais contre lui-même.
405 \item Tous les joueurs ont déjà joué au moins un match conte un autre
406   joueur.
407 \item Il y a un joueur qui a déjà joué contre tout le monde.
408 \item Il y a un joueur qui a déjà gagné contre tout le monde.
409 \item Il y a un joueur qui a joué contre tout le monde et  perdu tous
410   ses matchs. 
411 \end{enumerate}
412 \end{exo}
413
414 \begin{exo}
415 On considère un graphe représentant la carte d'une ville~: chaque n\oe{}ud est
416 un croisement, chaque arête un tronçon de rue, codant le sens de
417 circulation.  On considère de plus que les neouds sont coloriés, en rouge
418 (s'il y a un feu de signalisation au croisement) ou en bleu (s'il n'y a pas
419 de feu). 
420 Exprimer, dans le vocabulaire de la théorie des graphes les
421 propriétés suivantes.
422
423 \begin{enumerate}
424 \item Il n'y a pas de sens unique.
425 \item Il n'y a pas d'impasse. 
426 \item De n'importe où, je peux aller partout. 
427 \item De n'importe où, je peux aller partout en passant par au plus trois
428   feux de signalisation.
429 \item Deux croisements  consécutifs ne peuvent avoir tout deux des feux. 
430 \item Il n'y a jamais plus de deux rues qui se croisent à la fois. 
431 \item Il n'y a ni pont, ni tunnel.
432 \end{enumerate}
433 \end{exo}
434
435 \begin{exo}
436 On considère le graphe $G$ dont les sommets sont les configurations possible
437 d'un rubics cube, et il y a une arête entre deux configurations si l'on peut
438 passer de l'une à l'autre en jouant un coup (c'est-à-dire une rotation d'un
439 quart de tour d'un coté). Exprimer avec le vocabulaire de la théorie des
440 graphes les propriétés suivantes (on ne cherche pas à savoir si elles sont
441 vraies ou fausse)~:
442 \begin{itemize}
443 \item Il y a toujours une solution.
444 \item A partir de certaines configurations, il n'y a pas de solution.
445 \item De toute position, si je modifie le cube, je peux revenir à cette
446   position. 
447 \item Il existe une position dans laquelle je peux résoudre le rubics cube,
448   mais pas en moins de 30 coups.
449 \item Si dans une position je peux résoudre le rubics cube, alors je peux le
450   résoudre en moins de 30 coups. 
451 \end{itemize}
452 \end{exo}
453
454
455 \begin{exo}
456 On considère un ensemble de $n$ enfants portant chacun un dossard différent,
457 numéroté de $1$ à $n$, et jouant à cache-cache. On considère le graphe dont
458 les sommets sont les entiers de $1$ à $n$ et il y a une arête entre $i$ et
459 $j$ si l'enfant avec le dossard $i$ peut voir l'enfant avec le dossard $j$.
460 Exprimer dans le vocabulaire de la théorie des graphes les propriétés
461 suivantes~:
462
463 \begin{enumerate}
464 \item Il y a un enfant bien caché qu'aucun autre ne peut voir.
465 \item Il y a un enfant qui ne voit personne.
466 \item Un enfant se voit toujours lui-même.
467 \item Il y a deux enfants qui se voient l'un l'autre.
468 \item Tout enfant voit au moins un autre enfant.
469 \end{enumerate}
470 \end{exo}
471
472
473 \begin{exo}
474 Un homme se trouve au bord d'une rivière avec un choux, une chèvre et loup.
475 Il possède une barque et veut traverser la rivière. Cependant, il ne peut
476 mettre en même temps, en plus de lui, dans la barque qu'un des trois. Et,
477 malheureusement aussi, il ne peut laisser sur une rive seul le loup avec la
478 chèvre, ni la chèvre avec le choux.
479
480
481 Modéliser le problème avec un graphe et proposer une solution.
482 \end{exo}
483
484 \begin{exo}
485 On considère un site Web statique, installé sur un serveur. On se pose les
486 questions suivantes, liées à l'ergonomie du site~:
487 \begin{enumerate}
488 \item Puis-je à l'aide de la souris uniquement accéder à toutes les pages du
489   site à partir de la page d'accueil~?
490 \item Puis-je toujours en un clic retourner à la page d'accueil~?
491 \item Puis-je, à partir de n'importe quelle page, accéder à n'importe quelle
492   autre page en moins de 3 clics~?
493 \end{enumerate}
494
495 Proposer une modélisation de cette situation par un graphe, puis décrire des
496 algorithmes pour répondre aux questions posées. 
497
498 \end{exo}
499
500
501
502 \begin{figure}[t]
503 \begin{tikzpicture}
504
505 \draw (0,0) rectangle +(6,4);
506 \draw (0,0) rectangle +(1.5,1);
507 \draw (0,0) rectangle +(1.5,2);
508 \draw (0,0) rectangle +(1.5,3);
509 \draw (0,0) rectangle +(1.5,4);
510 \draw (1.5,2) rectangle +(1.5,2);
511 \draw (1.5,1) rectangle +(3,3);
512 \draw (0,0) rectangle +(4.5,1);
513
514 \draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ;
515 \draw (0.5,0.9) [fill=white]rectangle +(0.5,.2);
516 \draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2);
517 \draw (2,1-0.1) [fill=white]rectangle +(0.5,.2);
518
519
520 \draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
521 \draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
522 \draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
523 \draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5);
524 \draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5);
525 \draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
526 \end{tikzpicture}
527 \caption{Plan du musée 1}\label{m1}
528 \end{figure}
529
530
531 \begin{exo}
532 On considère le musée décrit dans la figure~\ref{m1}. Le directeur
533 souhaite, pour une exposition exceptionnelle, placer un gardien dans chaque
534 salle. Il recrute pour cela des gardiens espagnols (qui ne parlent que
535 l'espagnol) et des gardiens italiens (qui ne parlent qu'italien). Afin qu'il
536 ne discutent pas entre eux, il ne veut pas que deux gardiens de la même
537 nationalité soient dans des salles voisines. Est-ce possible~?
538
539 \bigskip
540 Même question avec le musée de la figure~\ref{m2}.
541
542 \begin{figure}[h]
543 \begin{tikzpicture}
544
545 \draw (0,0) rectangle +(6,4);
546 \draw (0,0) rectangle +(1.5,1);
547 \draw (0,0) rectangle +(1.5,2);
548 \draw (0,0) rectangle +(1.5,3);
549 \draw (0,0) rectangle +(1.5,4);
550 \draw (1.5,2) rectangle +(1.5,2);
551 \draw (1.5,1) rectangle +(3,3);
552 \draw (0,0) rectangle +(4.5,1);
553
554 \draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ;
555 \draw (0.5,0.9) [fill=white]rectangle +(0.5,.2);
556 \draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2);
557 \draw (2,1-0.1) [fill=white]rectangle +(0.5,.2);
558
559
560 \draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
561 %\draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5);
562 \draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
563 \draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5);
564 %\draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5);
565 \draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5);
566 \end{tikzpicture}
567 \caption{Plan du musée 2}\label{m2}
568 \end{figure}
569
570 \bigskip
571 Généraliser ce problème sur les graphes. Décrire un algorithme pour le
572 résoudre~?
573 \end{exo}
574
575
576 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
577 \section{Codage des graphes}
578
579 On s'intéresse maintenant à coder les graphes (en machine). Il y a deux
580 méthodes principales (qui admettent des variantes), le codage par liste
581 d'adjacence et le codage par matrice d'adjacence.
582
583
584 \subsection{Codage par matrices d'adjacence}
585
586 Soit $G=(V,E)$ un graphe. On suppose, sans perte de généralité, que
587 $V=\{1,\ldots,n\}$. On appelle {\bf matrice d'adjacence} de $V$ le tableau
588 (matrice) de taille $n$ sur $n$ ne contenant que des $0$ ou des $1$ et
589 défini par~: la case de la $i$-ème ligne et de la $j$-ième colonne contient
590 un $1$ si et seulement si $(i,j)\in E$. 
591
592 On considère par exemple le graphe 
593 $(\{1,2,3,4\},\{(1,1),(1,2),(3,1),(2,4),(3,4)\})$ dessiné  sur la
594 figure~\ref{fig:g1}. Sa matrice d'adjacence est 
595 $$\left(
596 \begin{array}{cccc}
597 1 & 1 & 0 & 0\\
598 0 & 0 & 0 & 1\\
599 1 & 0 & 0 & 1\\
600 0 & 0 & 0 & 0 
601 \end{array}
602 \right).
603 $$
604
605 Réciproquement, le graphe dont la matrice d'adjacence est 
606 $\left(
607 \begin{array}{cccc}
608 0 & 0 & 1 & 0\\
609 1 & 0 & 0 & 0\\
610 1 & 1 & 0 & 1\\
611 0 & 1 & 0 & 0 
612 \end{array}
613 \right)
614 $ est le graphe ci-dessous~:
615 \bigskip
616
617 \begin{center}
618 \begin{tikzpicture}
619 \node (1) at (0,0) {$1$};
620 \node (2) at (4,0) {$2$};
621 \node (3) at (2,-1) {$3$};
622 \node (4) at (2,1) {$4$};
623 \path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3);
624 \path[->,>=triangle 90] (2) edge[] node [above] {} (1);
625 \path[->,>=triangle 90] (3) edge[bend left] node [above] {} (1);
626 \path[->,>=triangle 90] (3) edge[] node [above] {} (2);
627 \path[->,>=triangle 90] (3) edge[] node [above] {} (4);
628 \path[->,>=triangle 90] (4) edge[] node [above] {} (2);
629 \end{tikzpicture}
630 \end{center}
631
632
633 \begin{exo}
634 Dessiner le graphe dont la matrice d'adjacence est $\left(
635 \begin{array}{cccccc}
636 1 & 1 & 1 & 0 & 0 & 0\\
637 1 & 0 & 1 & 0 & 1 & 0\\
638 0 & 1 & 1 & 0 & 0 & 1\\
639 0 & 1 & 0 & 0 & 1 & 1\\ 
640 1 & 0 & 0 & 0 & 0 & 0\\
641 0 & 0 & 1 & 1 & 0 & 0\\ 
642 \end{array}
643 \right)$.
644
645 \noindent
646 Quel est la matrice d'adjacence du graphe où $V=\{1,\ldots,7\}$ et 
647 $$E=\{(1,2),(4,2),(3,5),(7,1),(6,4),(1,5),(5,0) \}~?$$
648 \end{exo}
649
650 \begin{exo}
651 Soit $(V,E)$ un graphe. Comment lit-on sur la matrice d'adjacence de ce
652 graphe que la relation $E$ est réflexive~? symétrique~? antisymétrique~?
653 \end{exo}
654
655
656 \begin{exo}
657 Pour tout graphe orienté $G$, on note $G^R$ le graphe défini par~: les
658 sommets de $G^R$ sont les mêmes que ceux de $G$ et $(x,y)$ est une arête de 
659  $G^R$ si et seulement si $(y,x) $ est une arête de $G$. Le graphe  $G^R$
660 s'appelle {\it miroir} de $G$. 
661
662 \begin{figure}[h]
663 \begin{center}
664 \begin{tikzpicture}[scale=0.7]
665 \node (1) at (0,0) [draw,state] {$1$};
666 \node (2) at (3,0) [draw,state] {$2$};
667 \node (3) at (6,0) [draw,state] {$3$};
668 \node (4) at (9,0) [draw,state] {$4$};
669 \path[->,thick,draw] (1) -- (2);
670 \path[->,thick,draw] (2) -- (3);
671 \path[->,thick,draw] (3) edge[out=-45] node [swap] {} (4);
672 \path[->,thick,draw] (4) edge[out=-135,in=45] node [swap] {} (3);
673 \path[->,thick,draw] (1) edge[loop above] node [] {} (1);
674 \end{tikzpicture}
675 \end{center}
676 \caption{}\label{fig-exo1}
677 \end{figure}
678
679 \begin{enumerate}
680 \item Dessiner le graphe miroir du graphe de la figure~\ref{fig-exo1}.
681 \item Soit $A$ la matrice d'adjacence d'un graphe $G$. Quelle est la matrice
682   d'adjacence de $G^R$, en fonction de $A$~?
683 \item Justifier que $(G^R)^R=G$ pour tout graphe $G$. 
684 \item Justifier que si $G$ contient une boucle de longueur $k$, alors $G^R$
685   aussi. 
686 \end{enumerate}
687
688 \end{exo}
689
690 \subsection{Codage par liste d'adjacence}
691
692 Le codage d'un graphe par liste d'adjacence consiste à coder, pour chaque
693 sommet du graphe, l'ensemble de ses voisins par une liste {\it
694   triée}\footnote{Attention, le fait qu'elle soit triée n'est pas toujours
695   imposé dans la littérature, mais c'est le choix que nous prendrons.}.
696 On considère encore que $V=\{1,\ldots,n\}$. On dispose alors d'un tableau de
697 taille $n$ dont la première case contient  la liste des voisins de $1$, la
698 seconde la liste des voisins de $2$, etc. 
699
700 Par exemple, le graphe de la figure~\ref{fig:g1} se code par le tableau de
701 liste~:
702
703 \medskip
704 \begin{center}
705 \begin{tikzpicture}
706 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (1) at (0,0) {};
707 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (2) at (0,-0.5) {};
708 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (3) at (0,-1) {};
709 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (4) at (0,-1.5) {};
710 \node (1a) at (0,0) {};
711 \node  (2a) at (0,-0.5) {};
712 \node  (3a) at (0,-1) {};
713 \node  (4a) at (0,-1.5) {};
714
715
716 \node  (11) at (1,0) {$1$};
717 \node  (12) at (2,0) {$2$};
718 \node  (13) at (4,0) {NULL};
719
720 \node  (21) at (1,-0.5) {$4$};
721 \node  (22) at (3,-0.5) {NULL};
722
723 \node  (31) at (1,-1) {$1$};
724 \node  (32) at (2,-1) {$4$};
725 \node  (33) at (4,-1) {NULL};
726
727 \node  (41) at (2,-1.5) {NULL};
728 \path[->,>=triangle 90] (1a) edge[] node [above] {} (11);
729 \path[->,>=triangle 90] (11) edge[] node [above] {} (12);
730 \path[->,>=triangle 90] (12) edge[] node [above] {} (13);
731
732 \path[->,>=triangle 90] (2a) edge[] node [above] {} (21);
733 \path[->,>=triangle 90] (21) edge[] node [above] {} (22);
734
735 \path[->,>=triangle 90] (3a) edge[] node [above] {} (31);
736 \path[->,>=triangle 90] (31) edge[] node [above] {} (32);
737 \path[->,>=triangle 90] (32) edge[] node [above] {} (33);
738 \path[->,>=triangle 90] (4a) edge[] node [above] {} (41);
739
740
741 \end{tikzpicture}
742 \end{center}
743
744
745 \begin{exo}
746 Dessiner le graphe dont la représentation par liste d'adjacence est~:
747
748 \medskip
749 \begin{center}
750 \begin{tikzpicture}
751 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (1) at (0,0) {};
752 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (2) at (0,-0.5) {};
753 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (3) at (0,-1) {};
754 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (4) at (0,-1.5) {};
755 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (5) at (0,-2) {};
756 \node[draw,minimum width=0.5cm,minimum height=0.5cm]  (6) at (0,-2.5) {};
757 \node (1a) at (0,0) {};
758 \node  (2a) at (0,-0.5) {};
759 \node  (3a) at (0,-1) {};
760 \node  (4a) at (0,-1.5) {};
761 \node  (5a) at (0,-2) {};
762 \node  (6a) at (0,-2.5) {};
763
764
765 \node  (11) at (1,0) {$2$};
766 \node  (12) at (2,0) {$5$};
767 \node  (13) at (4,0) {NULL};
768
769 \node  (21) at (1,-0.5) {$3$};
770 \node  (22) at (3,-0.5) {NULL};
771
772 \node  (31) at (1,-1) {$1$};
773 \node  (32) at (2,-1) {$4$};
774 \node  (33) at (3,-1) {$5$};
775 \node  (34) at (4,-1) {$6$};
776 \node  (35) at (6,-1) {NULL};
777
778 \node  (41) at (1,-1.5) {$2$};
779 \node  (42) at (3,-1.5) {NULL};
780
781 \node  (51) at (2,-2) {NULL};
782
783
784 \node  (61) at (1,-2.5) {$2$};
785 \node  (62) at (2,-2.5) {$3$};
786 \node  (63) at (3,-2.5) {$4$};
787 \node  (64) at (4,-2.5) {$6$};
788 \node  (65) at (6,-2.5) {NULL};
789 \path[->,>=triangle 90] (1a) edge[] node [above] {} (11);
790 \path[->,>=triangle 90] (11) edge[] node [above] {} (12);
791 \path[->,>=triangle 90] (12) edge[] node [above] {} (13);
792
793 \path[->,>=triangle 90] (2a) edge[] node [above] {} (21);
794 \path[->,>=triangle 90] (21) edge[] node [above] {} (22);
795
796 \path[->,>=triangle 90] (3a) edge[] node [above] {} (31);
797 \path[->,>=triangle 90] (31) edge[] node [above] {} (32);
798 \path[->,>=triangle 90] (32) edge[] node [above] {} (33);
799 \path[->,>=triangle 90] (33) edge[] node [above] {} (34);
800 \path[->,>=triangle 90] (34) edge[] node [above] {} (35);
801
802
803 \path[->,>=triangle 90] (4a) edge[] node [above] {} (41);
804 \path[->,>=triangle 90] (41) edge[] node [above] {} (42);
805
806
807 \path[->,>=triangle 90] (5a) edge[] node [above] {} (51);
808
809
810 \path[->,>=triangle 90] (6a) edge[] node [above] {} (61);
811 \path[->,>=triangle 90] (61) edge[] node [above] {} (62);
812 \path[->,>=triangle 90] (62) edge[] node [above] {} (63);
813 \path[->,>=triangle 90] (63) edge[] node [above] {} (64);
814 \path[->,>=triangle 90] (64) edge[] node [above] {} (65);
815
816 \end{tikzpicture}
817 \end{center}
818
819
820 \end{exo}
821
822 \begin{exo}
823 Dessiner la représentation par liste d'adjacence du graphe de la
824 figure~\ref{fig:grapheexo1}.
825 \end{exo}
826
827
828 \begin{exo}\label{titi}
829 On considère que l'on code en Python un graphe par liste d'adjacence de la
830 manière suivante~:
831 \begin{itemize}
832 \item Un graphe un un couple de la forme $(V,E)$,
833 \item $V$ est une liste d'éléments tous différents, triés,
834 \item $E$ est un dictionnaire qui à chaque élément de $V$ associe la liste
835   triée de ses voisins.
836 \end{itemize}
837
838
839 \begin{enumerate}
840 \item Dessiner le graphe correspondant à \\
841 {\tt ([1,2,3],\{1:[2],2:[2,3],3:[1,3]\})}
842 \item Écrire une fonction qui teste si un coupe $(V,E)$ où $V$ est une liste
843   d'entiers et $E$ un dictionnaire, représente bien un graphe par liste
844   d'adjacence. 
845
846 \item Écrire une fonction qui compte le nombre d'arêtes d'un graphe.
847
848 \item Écrire une fonction qui teste si $(i,j)$ est une arête d'un graphe. 
849
850 \item On appelle {\it sommet bloquant} un sommet $i$ tel que pour tout
851   sommet $j$, $(i,j)$ n'est pas une arête. Écrire une fonction qui teste
852   si un sommet est bloquant.
853
854 \item On appelle {\it sommet puits} un sommet $i$ tel que pour tout
855   sommet $j\neq i$, $(i,j)$ n'est pas une arête et tel que $(i,i)$ soit
856   une arête. Écrire une fonction qui teste
857   si un sommet est un puits.
858
859 \item Écrire une fonction qui ajoute une arête $(i,j)$ à un graphe. 
860
861 \item Écrire une fonction qui supprime une arête $(i,j)$ à un graphe (on
862   rappelle que la méthode {\tt remove} de python retire la première
863   occurrence d'une valeur donnée en paramètre).
864
865 \end{enumerate}
866  
867 \end{exo}
868
869
870
871
872 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
873
874 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
875
876 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
877
878 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
879
880 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
881 \chapter{Parcours de Graphes}
882
883 L'exercice suivant est une introduction aux parcours de graphes. 
884
885 \begin{exo}
886 On considère le graphe de la figure~\ref{fig:zomb}. Il y a une flèche entre
887 $x$ et $y$ si $x$ connaît l'adresse de $y$. On considère aussi que certains
888 individus dans cette liste peuvent être des zombies. 
889 \begin{enumerate}
890 \item On considère que chaque nuit, un zombie va mordre et donc transformer
891   en zombie des individus dont il connaît l'adresse et qui ne sont pas encore
892   zombies. Si c'est possible, chaque zombie transforme au moins
893   un zombie par nuit. En supposant qu'au départ seule Karina est un zombie,
894   donner quelques possibilités indiquant, in fine, qui  zombifie qui?
895   Dessiner les solutions à l'aide d'un graphe où $(x,y)$ est une arête si
896   $x$ a zombifié $y$. 
897
898 \item On considère maintenant que chaque nuit, chaque zombie va transformer
899   tous les individus  dont il connaît l'adresse et qui ne sont pas encore
900   zombies.  En supposant qu'au départ seule Karina est un zombie,
901   donner quelques possibilités indiquant, in fine, qui  zombifie qui?
902
903 \item On suppose maintenant que chaque zombie doit non seulement  transformer
904   tous les individus  dont il connaît l'adresse et qui ne sont pas encore
905   zombies, mais aussi dans l'ordre croissant de leur numéros. Par exemple,
906   Karina transformera dans l'ordre Raph, Mike puis David. On suppose de plus
907   que chaque nuit les zombies vont mordre à tour de rôle, en commençant par
908   celui qui à été transformé en zombies le plus anciennement.   En supposant
909   qu'au départ seule Karina est un zombie. Écrire qui  zombifie qui, et dans
910   quel ordre.  
911
912 \item On suppose maintenant que chaque nuit, un zombie dont aucun voisin
913   (au sens des graphes) 
914   n'est zombie va mordre le premier (par ordre de numéro) des individus non
915   zombies qu'il connaît qui n'est pas encore zombie. Un zombie qui a au moins
916   un voisin zombie ne fait rien la nuit, il attend.  Un zombie dont tous les
917   voisins sont devenus eux aussi des zombies se transforme en poussière. 
918  En supposant
919   qu'au départ seule Karina est un zombie, Écrire qui a zombifié qui, et dans
920   quel ordre.  
921
922
923 \end{enumerate}
924
925 \begin{figure}[h]
926 \begin{center}
927 \begin{tikzpicture}
928
929 \node (1)  at (0,0) {Raph (1)};
930 \node (2)  at (-2,-2) {Jeff (2)};
931 \node (3)  at (0,-3) {Peter (3)};
932 \node (4)  at (2,-2) {Chris (4)};
933 \node (5)  at (0,2) {Mike (5)};
934 \node (6)  at (-3,2) {Karina (6)};
935 \node (7)  at (-3,0) {David (7)};
936 \node (8)  at (3,0) {John-Claude (8)};
937
938 \path[->,>=triangle 90] (6) edge[] node [above] {} (5);
939 \path[->,>=triangle 90] (6) edge[] node [above] {} (7);
940 \path[->,>=triangle 90] (6) edge[] node [above] {}  (1);
941
942 \path[->,>=triangle 90] (1) edge[] node [above] {}  (5);
943 \path[->,>=triangle 90] (1) edge[] node [above] {}  (7);
944 \path[->,>=triangle 90] (1) edge[] node [above] {}  (8);
945 \path[->,>=triangle 90] (1) edge[] node [above] {}  (2);
946
947 \path[->,>=triangle 90] (4) edge[] node [above] {}  (1);
948
949 \path[->,>=triangle 90] (5) edge[] node [above] {}  (8);
950 \path[->,>=triangle 90] (8) edge[] node [above] {}  (4);
951 \path[->,>=triangle 90] (2) edge[] node [above] {}  (3);
952 \path[->,>=triangle 90] (2) edge[] node [above] {}  (4);
953 \path[->,>=triangle 90] (3) edge[] node [above] {}  (4);
954 \path[->,>=triangle 90] (3) edge[] node [above] {}  (1);
955
956
957 \end{tikzpicture}
958 \end{center}
959 \caption{Graphe des connaissances}\label{fig:zomb}
960 \end{figure}
961 \end{exo}
962
963
964 Les graphes obtenus dans les questions de l'exercice précédent s'appellent
965 des {\it arbres couvrants}. La façon de procéder de la question~3 s'appelle
966 {\it parcours en largeur} et celle de la question~4 s'appelle {\it parcours
967   en profondeur}. 
968
969
970 \section{Arbres couvrants}
971
972 \subsection{Arbres}
973
974
975 Un {\bf arbre} est un graphe $G=(V,E)$ tel que~:
976 \begin{enumerate}
977 \item[(1)] Il n'y a pas de boucle de longueur non nulle dans $G$ (on dit que $G$
978   est acyclique).
979
980 \item[(2)] Si $(x,y)$ et $(z,y)$ sont dans $E$, alors $x=z$. 
981
982 \item[(3)] Il existe un sommet $x_0$, appelé {\bf racine}, tel que pour
983   tout sommet $y$, il existe une chemin de $x_0$ à $y$.
984 \end{enumerate}
985
986 Un exemple d'arbre dont la racine est $1$ est dessiné sur la
987 figure~\ref{fig:arbre}.
988
989 \begin{exo}
990 Dessiner trois arbres différents à 6 sommets.
991 \end{exo}
992
993
994 \begin{exo}
995 Dessiner un graphe qui vérifie $(1)$ et $(2)$ de la définition mais qui
996 n'est pas un arbre. Même question avec $(2)$ et $(3)$. Même question avec
997 $(3)$ et $(1)$.
998 \end{exo}
999
1000 \medskip
1001 Dans un arbre, on utilise à la fois une terminologie de type 
1002 \og {\it végétal}\fg{} et
1003 aussi
1004 de type \og {\it arbre généalogique}\fg{}. 
1005 On appelle {\bf feuille} tout sommet d'un arbre qui n'a pas de voisin.  Tout
1006 chemin de la racine à une feuille est appelée {\bf branche}. Les voisins
1007 d'un noeud sont appelés ses {\bf fils}. 
1008 Tous les sommets atteignables depuis un sommet $x$ sont dits les {\bf
1009   descendants} de $x$ et ils constituent le {\bf sous-arbre} enraciné en $x$.
1010 Si $y$ est atteignable depuis $x$, alors $x$ est un {\bf ancêtre} de $y$. 
1011 Si $y$ est un voisin de $x$, alors $x$ est le {\bf père} de $y$. Deux sommets
1012 qui ont le même père sont {\bf frères}. 
1013 Par exemple, dans le dessin de la figure~\ref{fig:arbre},
1014 $6$ est le père de $7$, $3$ est un frère de $2$ et $5$ est une descendant de
1015 $1$.  
1016
1017 \begin{figure}
1018 \begin{center}
1019 \begin{tikzpicture}[scale=0.6]
1020 \node (1) at (0,0) {$1$};
1021 \node (2) at (-3,-2) {$2$};
1022 \node (3) at (3,-2) {$3$};
1023
1024 \node (5) at (-2,-4) {$5$};
1025 \node (4) at (-3,-4) {$4$};
1026 \node (6) at (3,-4) {$6$};
1027
1028 \node (7) at (1,-6) {$7$};
1029 \node (8) at (2,-6) {$8$};
1030 \node (9) at (3,-6) {$9$};
1031
1032
1033 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
1034 \path[->,>=triangle 90] (1) edge[] node [above] {} (3);
1035 \path[->,>=triangle 90] (2) edge[] node [above] {} (5);
1036 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
1037 \path[->,>=triangle 90] (3) edge[] node [above] {} (6);
1038 \path[->,>=triangle 90] (6) edge[] node [above] {} (7);
1039 \path[->,>=triangle 90] (6) edge[] node [above] {} (8);
1040 \path[->,>=triangle 90] (6) edge[] node [above] {} (9);
1041 \end{tikzpicture}
1042 \end{center}
1043 \caption{Exemple d'arbre}\label{fig:arbre}
1044 \end{figure}
1045
1046
1047 \begin{exo}
1048 Dans le graphe de la figure~\ref{fig:arbre}, quels sont les descendants de
1049 $3$? Les fils de $1$? Les ancêtres de $6$? les feuilles?
1050 \end{exo}
1051
1052
1053 % \begin{exo}
1054 % On considère dans cet exercice des arbres codés par liste d'adjacence comme
1055 % dans l'exercice en Python de la page~\pageref{titi}. On suppose que la
1056 % racine est le premier sommet de la liste $V$.
1057
1058 % \begin{enumerate}
1059 % \item Écrire une fonction qui compte le nombre de feuille d'un arbre.
1060 % \item Écrire une fonction qui compte le nombre de descendants d'un sommet
1061 %   donné. 
1062 % \end{enumerate}
1063 % \end{exo}
1064 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1065 \subsection{Parcours d'arbres}
1066
1067
1068 Parcourir un arbre, c'est appliquer un algorithme qui va visiter, une et une
1069 seule fois chaque sommet de l'arbre. Les deux parcours les plus connus, sont
1070 les parcours préfixes et suffixes. A chaque visite de noeud,  une fonction
1071 {\tt Traiter} est appliquée, selon ce que l'on souhaite faire. 
1072
1073 Le parcours Préfixe est l'algorithme récursif suivant. Initialement, le
1074 parcours est lancé à la racine. 
1075
1076 \begin{verbatim}
1077 Parcours-Prefixe(V,E,x):
1078    Traiter(x)
1079    Pour chaque fils f de x:
1080       Parcours-Prefixe(V,E,f)
1081    FinPour
1082 \end{verbatim}
1083
1084 Si l'on applique {\tt Parcours-Prefixe} en $1$ sur l'arbre de la
1085 figure~\ref{fig:arbre}, avec pour fonction {\tt Traiter} la fonction qui
1086 affiche la valeur du sommet on obtient. 
1087
1088 $1$ {\tt Parcours-Prefixe(2)} {\tt Parcours-Prefixe(3)} \hspace{2cm} (sommets
1089 dans l'ordre)
1090
1091 \noindent
1092 Or {\tt Parcours-Prefixe(2)} retourne
1093
1094 $2$ {\tt Parcours-Prefixe(4)} {\tt Parcours-Prefixe(5)} \hspace{2cm}  et
1095 donc retourne 
1096
1097 $2$ $4$ $5$
1098
1099
1100 \noindent
1101 De même  {\tt Parcours-Prefixe(3)} retourne
1102
1103 $3$ $6$ $7$ $8$ $9$
1104
1105 \noindent
1106 Et donc  {\tt Parcours-Prefixe(1)} retourne
1107
1108 $1$ $2$ $4$ $5$ $3$ $6$ $7$ $8$ $9$
1109
1110
1111 \begin{exo}
1112 Que retourne l'algorithme de parcours préfixe sur l'arbre de la figure~\ref{fig:arbre2}.
1113
1114
1115 \begin{figure}
1116 \begin{center}
1117 \begin{tikzpicture}[scale=0.6]
1118 \node (1) at (0,0) {$1$};
1119 \node (2) at (3,-2) {$3$};
1120 \node (3) at (-3,-2) {$2$};
1121 \node (4) at (4,-4) {$4$};
1122 \node (5) at (2,-4) {$6$};
1123 \node (6) at (-3,-4) {$5$};
1124 \node (7) at (-3,-6) {$7$};
1125 \node (8) at (-2,-6) {$8$};
1126 \node (9) at (2,-6) {$9$};
1127 \node (10) at (3,-6) {$10$};
1128
1129
1130 \path[->,>=triangle 90] (1) edge[] node [above] {} (2);
1131 \path[->,>=triangle 90] (1) edge[] node [above] {} (3);
1132 \path[->,>=triangle 90] (3) edge[] node [above] {} (5);
1133 \path[->,>=triangle 90] (2) edge[] node [above] {} (4);
1134 \path[->,>=triangle 90] (3) edge[] node [above] {} (6);
1135 \path[->,>=triangle 90] (6) edge[] node [above] {} (7);
1136 \path[->,>=triangle 90] (6) edge[] node [above] {} (8);
1137 \path[->,>=triangle 90] (5) edge[] node [above] {} (9);
1138 \path[->,>=triangle 90] (5) edge[] node [above] {} (10);
1139 \end{tikzpicture}
1140 \end{center}
1141 \caption{Arbre}\label{fig:arbre2}
1142 \end{figure}
1143
1144 \end{exo}
1145
1146 \medskip
1147 La parcours suffixe est identique à la différence près que le traitement se
1148 fait après l'appel récursif. 
1149
1150 \begin{verbatim}
1151 Parcours-Suffixe(V,E,x):
1152    Pour chaque fils f de x:
1153       Parcours-Suffixe(V,E,f)
1154    FinPour
1155    Traiter(x)
1156 \end{verbatim}
1157
1158 \begin{exo}
1159 Que donne le parcours suffixe sur les arbres des figures~\ref{fig:arbre} et~\ref{fig:arbre2}?
1160 \end{exo}
1161
1162 % \begin{exo}
1163 % Avec le même codage que précédemment, écrire en Python des fonctions de
1164 % parcours préfixe et suffixe.
1165 % \end{exo}
1166
1167 %%%%%%%%%%%%%%%%%%%%%
1168 \subsection{Arbres couvrants}
1169
1170 Attention, ici, on parle d'arbres couvrants de graphes orientés.
1171
1172 Soit $G=(V,E)$. Un arbre couvrant pour $G$, enraciné en $x\in V$, est un
1173 arbre $(V^\prime,E^\prime)$ tel que
1174 \begin{enumerate}
1175 \item[(1)] $V^\prime\subseteq V$ et  $E^\prime\subseteq E$.
1176 \item[(2)] $x$ est la racine de $(V^\prime,E^\prime)$.
1177 \item[(3)] On ne peut pas rajouter à l'arbre un sommet ou une arête de sorte 
1178   que les conditions 
1179   $(1)$ et $(2)$ soient toujours vérifiées: l'arbre est maximal. 
1180 \end{enumerate}
1181
1182 Intuitivement un arbre couvrant est un arbre que l'on peut calquer sur un
1183 graphe -- conditions (1) et (2) -- sans pouvoir le prolonger.
1184 Considérons par exemple le graphe de la figure~\ref{fig:graphcouvrant}.
1185
1186 \begin{figure}[h]
1187 \begin{center}
1188 \begin{tikzpicture}[scale = 0.8]
1189 \node (0)  at (-2,-1) {0};
1190
1191 \node (1)  at (0,0) {1};
1192 \node (2) at (3,0) {2};
1193 \node (3)  at (6,0) {3};
1194 \node (4) at (9,0) {4};
1195 \node (5)  at (12,0) {5};
1196
1197 \node (6) at (0,-2) {6};
1198 \node (7) at (3,-2) {7};
1199 \node (8) at (6,-2) {8};
1200 \node (9) at (9,-2) {9};
1201
1202
1203
1204 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1205
1206 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1207 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1208 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1209 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1210 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1211 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1212
1213 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1214
1215 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1216 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1217 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1218
1219 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1220 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1221 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1222
1223
1224
1225 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1226
1227
1228
1229 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1230 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1231
1232 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1233
1234 \end{tikzpicture}
1235 \end{center}
1236 \caption{Graphe 1}\label{fig:graphcouvrant}
1237 \end{figure}
1238
1239 Dans ce graphe, l'arbre de gauche de la figure~\ref{fig:graphcouvrant2}
1240 vérifie bien $(1)$ et $(2)$ mais
1241 pas $(3)$.  En revanche celui de droite est bien un arbre couvrant. 
1242
1243
1244 \begin{figure}[h]
1245 \begin{center}
1246 \subfigure{
1247 \begin{tikzpicture}[scale = 0.8]
1248 \node (0)  at (-2,-1) {0};
1249
1250 \node (1)  at (0,0) {1};
1251 \node (2) at (2,0) {2};
1252 \node (6) at (0,-2) {6};
1253
1254 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1255
1256 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1257 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1258
1259 \end{tikzpicture}}\hspace{1cm}
1260 \subfigure{
1261
1262 \begin{tikzpicture}[scale = 0.6]
1263 \node (0)  at (-2,-1) {0};
1264
1265 \node (1)  at (0,0) {1};
1266 \node (2) at (3,0) {2};
1267 \node (3)  at (6,0) {3};
1268 \node (4) at (9,0) {4};
1269 \node (5)  at (12,0) {5};
1270
1271 \node (6) at (0,-2) {6};
1272 \node (7) at (3,-2) {7};
1273 \node (9) at (9,-2) {9};
1274
1275
1276
1277 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1278
1279 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1280 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1281 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1282
1283 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1284
1285
1286 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1287 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1288
1289 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1290
1291
1292
1293 \end{tikzpicture}
1294 }
1295 \end{center}
1296
1297 \caption{Arbres non couvrant et couvrant}\label{fig:graphcouvrant2}
1298 \end{figure}
1299
1300 % \begin{exo}
1301 % Écrire une fonction qui étant donné un graphe et un arbre codé en Python
1302 % comme précédemment, teste si l'arbre est un arbre couvrant du graphe (on ne
1303 % testera pas si c'est bien un arbre). 
1304 % \end{exo}
1305
1306
1307 L'objectif des algorithmes de parcours de graphes est de construire des
1308 arbres couvrants de graphes afin, ensuite, d'appliquer des parcours (type
1309 préfixe/suffixe) sur les arbres obtenus. Il existe deux constructions
1310 d'arbres couvrant très utilisées, appelées {\it parcours en largeur} et {\it
1311   parcours en profondeur}. 
1312
1313 %%%%%%%%%%%%%%%%%%%%%%%%%%%
1314 \subsection{Parcours en largeur}
1315
1316
1317 On ne donne pas explicitement l'algorithme de parcours en largeur à partir
1318 de $x$ qui
1319 demanderait l'introduction des structures de données. On se contente d'un
1320 pseudo-algorithme expliquant la méthode~:
1321 \begin{enumerate}
1322 \item $x$ est la racine de l'arbre.
1323 \item On insère dans l'arbre tous les voisins de $x$ (sauf éventuellement
1324   $x$), dans l'ordre. 
1325 \item On insère (dans l'ordre) dans l'arbre tous les voisins de la feuille
1326   la plus anciennement introduite dans l'arbre et pour laquelle c'est possible.
1327 \item On recommence l'étape précédente tant que c'est possible. 
1328 \end{enumerate}
1329
1330 Si l'on exécute le parcours sur le graphe de la
1331 figure~\ref{fig:graphcouvrant}, en partant du sommet $3$. Après les étapes
1332 $1$ et $2$ on a l'arbre $A_1$ de la figure~\ref{fig:parcourslargeur}. 
1333 La feuille introduite le plus anciennement
1334 (attention à l'ordre qui est l'ordre des numéro des sommets) est $2$. On
1335 ajoute donc $1$ et $6$ -- et pas $7$ qui y est déjà. On obtient alors
1336 l'arbre $A_2$ de la figure~\ref{fig:parcourslargeur}.
1337
1338 \begin{figure}[h]
1339 \begin{center}
1340 \subfigure[$A_1$]{
1341 \begin{tikzpicture}[scale = 0.6]
1342 \node (2) at (3,0) {2};
1343 \node (3)  at (6,0) {3};
1344 \node (4) at (9,0) {4};
1345 \node (5)  at (12,0) {5};
1346 \node (7) at (3,-2) {7};
1347
1348
1349
1350 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1351 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1352 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1353 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1354 \end{tikzpicture}
1355 }
1356 \subfigure[$A_2$]{
1357 \begin{tikzpicture}[scale = 0.6]
1358
1359 \node (1)  at (0,0) {1};
1360 \node (2) at (3,0) {2};
1361 \node (3)  at (6,0) {3};
1362 \node (4) at (9,0) {4};
1363 \node (5)  at (12,0) {5};
1364
1365 \node (6) at (0,-2) {6};
1366 \node (7) at (3,-2) {7};
1367
1368
1369
1370 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1371 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1372
1373
1374 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1375 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1376 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1377 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1378
1379
1380
1381
1382 \end{tikzpicture}
1383 }
1384 \end{center}
1385 \caption{Parcours en largeur}\label{fig:parcourslargeur}
1386 \end{figure}
1387
1388
1389 Ensuite, la feuille la plus anciennement introduite est $4$. Son seul voisin
1390 est $9$ qui n'est pas encore dans l'arbre. On obtient donc l'arbre $A_3$
1391 de la figure~\ref{fig:parcourslargeurA3}.
1392 Ensuite il s'agit du sommet $5$ dont l'unique fils $3$ est déjà dans
1393 l'arbre. La construction n'évolue donc pas pour $5$. Ensuite, on a fini les
1394 fils de $3$, on passe donc aux fils du premier fils de $3$, à savoir $2$.
1395 Les fils de $1$ sont $2$, $6$ et $7$, qui sont déjà dans l'arbre.  En
1396 continuant ainsi, on voit qu'il n'y a plus rien à ajouter. On obtient donc
1397 l'arbre de la figure~\ref{fig:parcourslargeurA3}
1398
1399 \begin{figure}[ht]
1400 \begin{center}
1401 \begin{tikzpicture}[scale = 0.6]
1402
1403 \node (1)  at (0,0) {1};
1404 \node (2) at (3,0) {2};
1405 \node (3)  at (6,0) {3};
1406 \node (4) at (9,0) {4};
1407 \node (5)  at (12,0) {5};
1408
1409 \node (6) at (0,-2) {6};
1410 \node (7) at (3,-2) {7};
1411
1412 \node (9) at (9,-2) {9};
1413
1414
1415
1416 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1417 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1418
1419
1420 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1421 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1422 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1423 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1424
1425 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1426
1427
1428
1429 \end{tikzpicture}
1430 \end{center}
1431 \caption{Parcours en largeur~$A_3$}\label{fig:parcourslargeurA3}
1432 \end{figure}
1433
1434
1435 \begin{exo}
1436 \begin{enumerate}
1437 \item Sur le graphe de la figure ci-dessous, dessiner les arbres
1438 obtenus par un parcours en largeur à partir de $2$. Même question en partant
1439 de $6$. Même question en partant de $9$. 
1440
1441 \begin{center}
1442 \begin{tikzpicture}[scale = 0.8]
1443 \node (0)  at (-2,-1) {0};
1444
1445 \node (1)  at (0,0) {1};
1446 \node (2) at (3,0) {2};
1447 \node (3)  at (6,0) {3};
1448 \node (4) at (9,0) {4};
1449 \node (5)  at (12,0) {5};
1450
1451 \node (6) at (0,-2) {6};
1452 \node (7) at (3,-2) {7};
1453 \node (8) at (6,-2) {8};
1454 \node (9) at (9,-2) {9};
1455
1456
1457
1458 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1459
1460 \path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2);
1461 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1462 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1463 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1464 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1465 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1466
1467 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1468
1469 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1470 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1471 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1472
1473 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1474 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1475 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1476
1477
1478
1479 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1480
1481
1482
1483 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1484 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1485
1486 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1487
1488
1489 \end{tikzpicture}
1490 \end{center}
1491
1492
1493 \item Même question à partir de $3$, puis de $0$, puis de $8$ sur le graphe de
1494 la figure~\ref{fig:exo}.
1495
1496 \begin{figure}[h]
1497 \begin{center}
1498 \begin{tikzpicture}[scale = 0.8]
1499 \node (0)  at (-2,-1) {0};
1500
1501 \node (1)  at (0,0) {1};
1502 \node (2) at (3,0) {2};
1503 \node (3)  at (6,0) {3};
1504 \node (4) at (9,0) {4};
1505 \node (5)  at (12,0) {5};
1506
1507 \node (6) at (0,-2) {6};
1508 \node (7) at (3,-2) {7};
1509 \node (8) at (6,-2) {8};
1510 \node (9) at (9,-2) {9};
1511 \node (10) at (12,-2) {10};
1512
1513 \node (11)  at (15,0) {11};
1514 \node (12)  at (15,-2) {12};
1515
1516 \node (13)  at (0,-4) {13};
1517 \node (14)  at (3,-4) {14};
1518 \node (15)  at (6,-4) {15};
1519 \node (16)  at (9,-4) {16};
1520 \node (17)  at (12,-4) {17};
1521 \node (18)  at (15,-4) {18};
1522
1523
1524
1525 \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1526 \path[->,>=triangle 90] (0) edge[] node [swap] {} (2);
1527 \path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3);
1528
1529 \path[->,>=triangle 90] (1) edge[] node [swap] {} (2);
1530 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1531 \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1532 \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1533 \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1534
1535 \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1536
1537 \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1538 \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1539 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1540
1541 \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1542 \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1543 \path[->,>=triangle 90] (5) edge[] node [swap] {} (11);
1544 \path[->,>=triangle 90] (5) edge[] node [swap] {} (12);
1545 \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1546
1547
1548
1549 \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
1550 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1551
1552 \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
1553 \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
1554
1555
1556 \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
1557
1558 \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1559 \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1560 \path[->,>=triangle 90] (8) edge[] node [swap] {} (14);
1561 \path[->,>=triangle 90] (8) edge[] node [swap] {} (15);
1562
1563 \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1564 \path[->,>=triangle 90] (9) edge[] node [swap] {} (8);
1565 \path[->,>=triangle 90] (9) edge[] node [swap] {} (16);
1566
1567 \path[->,>=triangle 90] (10) edge[] node [swap] {} (4);
1568 \path[->,>=triangle 90] (10) edge[] node [swap] {} (5);
1569 \path[->,>=triangle 90] (10) edge[] node [swap] {} (17);
1570
1571 \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
1572
1573 \path[->,>=triangle 90] (13) edge[] node [swap] {} (0);
1574 \path[->,>=triangle 90] (16) edge[] node [swap] {} (17);
1575 \path[->,>=triangle 90] (17) edge[] node [swap] {} (18);
1576 \path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16);
1577
1578 \end{tikzpicture}
1579 \end{center}
1580 \caption{Rappel d'un graphe du chapitre 1}\label{fig:exo}
1581 \end{figure}
1582 \end{enumerate}
1583 \end{exo}
1584
1585
1586 % \begin{exo}
1587 % Écrire en Python l'algorithme de parcours en largeur pour un graphe codé par
1588 % liste d'adjacence. 
1589 % \end{exo}
1590
1591
1592 % \begin{exo}
1593 % Écrire en Python une fonction qui teste si un graphe donné par liste
1594 % d'adjacence est un arbre dont la racine est le plus petit sommet. 
1595 % \end{exo}
1596
1597 \begin{exo} 
1598 Les
1599 {\em composantes fortement connexes} d'un graphe sont des sous-ensembles de
1600 sommets telles que~: (1) tout sommet appartient à une composante fortement
1601 connexe, (2) s'il existe un chemin de $p$ vers $q$ et un chemin de $q$ vers
1602 $p$, alors $p$ et $q$ doivent appartenir à la même composante fortement
1603 connexe~; et réciproquement.  
1604 \begin{enumerate}
1605 \item Deux composantes fortement connexes sont-elles forcément
1606   disjointes? Pourquoi? 
1607 \item Quels sont les composantes fortement connexes du graphe de la figure~\ref{fig:exo}.
1608
1609 \item Décrire une méthode algorithmique pour trouver les composantes
1610   fortement connexe d'un graphe. 
1611 \end{enumerate}
1612 \end{exo}
1613
1614
1615 % \begin{exo}
1616 % Comment utiliser un parcours en largeur pour trouver un chemin de taille la
1617 % plus courte possible entre deux sommets donnés?
1618 % \end{exo}
1619
1620 %%%%%%%%%%%%%%%
1621 \subsection{Parcours en profondeur}
1622
1623
1624 \begin{figure}
1625 \begin{center}
1626 \begin{tikzpicture}[scale = 0.8]
1627
1628 \node (1)  at (0,0) {1};
1629 \node (2) at (3,0) {2};
1630 \node (3)  at (6,0) {3};
1631 \node (6) at (0,-2) {6};
1632 \node (9) at (9,-2) {9};
1633
1634 \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1635 \path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1);
1636
1637
1638 \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1639
1640
1641
1642 \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1643
1644 \end{tikzpicture}
1645 \end{center}
1646 \caption{Parcours en profondeur (1)}\label{fig:prof1}
1647 \end{figure}
1648
1649
1650 On ne donne pas explicitement l'algorithme de parcours en profondeur à partir
1651 de $x$ qui
1652 demanderait l'introduction des structures de données. On se contente d'un
1653 pseudo-algorithme expliquant la méthode~:
1654 \begin{enumerate}
1655 \item $x$ est la racine de l'arbre.
1656 \item On insère dans l'arbre le premier voisin de $x$ (sauf éventuellement
1657   $x$). 
1658 \item On insère  dans l'arbre le premier  voisins du sommet
1659   le plus récemment introduit dans l'arbre et pour lequel c'est possible.
1660 \item On recommence l'étape précédente tant que c'est possible. 
1661 \end{enumerate}
1662
1663 On va appliquer la méthode sur l'arbre de la figure~\ref{fig:graphcouvrant},
1664 en partant du sommet $3$. L'arbre commence par $3$ à la racine. Puis on
1665 introduit le plus petit fils de $3$, c'est-à-dire $2$. La feuille la plus
1666 récente de l'arbre est $2$, donc on introduit le plus petit fils de $2$, à
1667 savoir $1$. A nouveau, on va introduire $6$, puis $9$. On obtient alors
1668 l'arbre de la figure~\ref{fig:prof1}.  
1669
1670
1671
1672 \pagebreak[3]
1673 \begin{exo}
1674 Donner les parcours en profondeur obtenus à partir de $0$, puis $8$, puis $7$
1675 sur le graphe de la figure~\ref{fig:exo}.
1676
1677
1678 % \begin{tikzpicture}[scale = 0.8]
1679 % \node (0)  at (-2,-1) {0};
1680
1681 % \node (1)  at (0,0) {1};
1682 % \node (2) at (3,0) {2};
1683 % \node (3)  at (6,0) {3};
1684 % \node (4) at (9,0) {4};
1685 % \node (5)  at (12,0) {5};
1686
1687 % \node (6) at (0,-2) {6};
1688 % \node (7) at (3,-2) {7};
1689 % \node (8) at (6,-2) {8};
1690 % \node (9) at (9,-2) {9};
1691 % \node (10) at (12,-2) {10};
1692
1693 % \node (11)  at (15,0) {11};
1694 % \node (12)  at (15,-2) {12};
1695
1696 % \node (13)  at (0,-4) {13};
1697 % \node (14)  at (3,-4) {14};
1698 % \node (15)  at (6,-4) {15};
1699 % \node (16)  at (9,-4) {16};
1700 % \node (17)  at (12,-4) {17};
1701 % \node (18)  at (15,-4) {18};
1702
1703
1704
1705 % \path[->,>=triangle 90] (0) edge[] node [swap] {} (1);
1706 % \path[->,>=triangle 90] (0) edge[] node [swap] {} (2);
1707 % \path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3);
1708
1709 % \path[->,>=triangle 90] (1) edge[] node [swap] {} (2);
1710 % \path[->,>=triangle 90] (1) edge[] node [swap] {} (6);
1711 % \path[->,>=triangle 90] (1) edge[] node [swap] {} (7);
1712 % \path[->,>=triangle 90] (2) edge[] node [swap] {} (7);
1713 % \path[->,>=triangle 90] (2) edge[] node [swap] {} (6);
1714
1715 % \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2);
1716
1717 % \path[->,>=triangle 90] (3) edge[] node [swap] {} (7);
1718 % \path[->,>=triangle 90] (3) edge[] node [swap] {} (4);
1719 % \path[->,>=triangle 90] (3) edge[] node [swap] {} (2);
1720
1721 % \path[->,>=triangle 90] (4) edge[] node [swap] {} (9);
1722 % \path[->,>=triangle 90] (5) edge[] node [swap] {} (9);
1723 % \path[->,>=triangle 90] (5) edge[] node [swap] {} (11);
1724 % \path[->,>=triangle 90] (5) edge[] node [swap] {} (12);
1725 % \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5);
1726
1727
1728
1729 % \path[->,>=triangle 90] (6) edge[] node [swap] {} (14);
1730 % \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9);
1731
1732 % \path[->,>=triangle 90] (7) edge[] node [swap] {} (13);
1733 % \path[->,>=triangle 90] (7) edge[] node [swap] {} (15);
1734
1735
1736 % \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10);
1737
1738 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (2);
1739 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (4);
1740 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (14);
1741 % \path[->,>=triangle 90] (8) edge[] node [swap] {} (15);
1742
1743 % \path[->,>=triangle 90] (9) edge[] node [swap] {} (3);
1744 % \path[->,>=triangle 90] (9) edge[] node [swap] {} (8);
1745 % \path[->,>=triangle 90] (9) edge[] node [swap] {} (16);
1746
1747 % \path[->,>=triangle 90] (10) edge[] node [swap] {} (4);
1748 % \path[->,>=triangle 90] (10) edge[] node [swap] {} (5);
1749 % \path[->,>=triangle 90] (10) edge[] node [swap] {} (17);
1750
1751 % \path[->,>=triangle 90] (12) edge[] node [swap] {} (10);
1752
1753 % \path[->,>=triangle 90] (13) edge[] node [swap] {} (0);
1754 % \path[->,>=triangle 90] (16) edge[] node [swap] {} (17);
1755 % \path[->,>=triangle 90] (17) edge[] node [swap] {} (18);
1756 % \path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16);
1757
1758 % \end{tikzpicture}
1759
1760 \end{exo}
1761
1762
1763
1764 % \begin{exo}
1765 % Écrire en Python l'algorithme de parcours en profondeur pour un graphe codé par
1766 % liste d'adjacence. 
1767 % \end{exo}
1768
1769
1770 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ù
1771 %\input{automates}
1772
1773 \end{document}