From 7e16643d8ba519bcc6512c70661b4ffa8ca521a0 Mon Sep 17 00:00:00 2001 From: couchot Date: Thu, 6 Feb 2014 13:48:32 +0100 Subject: [PATCH] ajout fichier pch --- graphes/S2MD.tex | 1773 ++++++++++++++++++++++++++++++++++++++++++++++ main13.log | 12 +- main13.pdf | Bin 369126 -> 370852 bytes 3 files changed, 1779 insertions(+), 6 deletions(-) create mode 100644 graphes/S2MD.tex diff --git a/graphes/S2MD.tex b/graphes/S2MD.tex new file mode 100644 index 0000000..a86b2b9 --- /dev/null +++ b/graphes/S2MD.tex @@ -0,0 +1,1773 @@ +\documentclass[]{report} +\usepackage[a4paper]{geometry} +\geometry{hmargin=1.5cm, vmargin=1.5cm } +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[french]{babel} +\usepackage{amsmath,amssymb,latexsym,eufrak,euscript,array} + + +\usepackage{pgf} +\usepackage{tikz} +\usepackage{pdfpages} +\usetikzlibrary{arrows} +\usetikzlibrary{automata} +\usetikzlibrary{snakes} +\usetikzlibrary{shapes} + +\usepackage[hang,centerlast]{subfigure} + + + +\newtheorem{definition}{Definition} +\newtheorem{theoreme}[definition]{Théorème} +\newtheorem{proposition}[definition]{Proposition} +\newtheorem{exemple}[definition]{Exemple} + +\newtheorem{Exo}[definition]{Exercice} + +\newenvironment{exo} +{\begin{Exo}{\rm } +{}\end{Exo}\vspace{-1em} +\begin{sf}}{\end{sf}} + +\def \A {\mathcal{A}} +\def \B {\mathcal{B}} + +\title{Cours Mathématiques Discrètes + \\IUT Belfort Montbéliard} +\author{{\sc Pierre-Cyrille HEAM}} + + +%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\begin{document} + +\maketitle + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{Graphes finis orientés} + + +%%%%%%%%%%%%%%%% +\section{Premières définitions} + +Un {\bf graphe fini orienté} est un couple $(V,E)$ où +\begin{itemize} +\item $V$ est un ensemble fini dont les éléments sont appelés {\bf sommets} + ou {\bf noeuds} ou {\bf états}. +\item $E\subseteq V\times V$ est un ensemble de couples d'éléments de $V$, + appelés {\bf arêtes} ou {\bf transitions}. +\end{itemize} + +Par exemple $\left(\{1,2,3\},\{(1,2),(2,2),(3,1)\}\right)$ est un graphe +fini orienté. Le choix des lettres $V$ et $E$ viennent de l'anglais pour +{\it vertice} et {\it edge}. On rappelle que dans un ensemble (entre $\{\}$) +les éléments ne sont pas ordonnés et n'apparaissent qu'au plus une fois. En +revanche dans un couple (deux éléments entre parenthèse), les éléments sont +ordonnés. Le couple $(1,2)$ est différent du couple $(2,1)$. + + +\begin{exo} +Les couples $(V,E)$ suivants sont-ils des graphes finis orienté~? +\begin{enumerate} +\item $V=\{1,2,3\}$ et $E=\{(1,3)\}$~? +\item $V=\{1,2,3\}$ et $E=\{(1,6),(2,4)\}$~? +\item $V=\{1,2,3\}$ et $\emptyset$~? +\item $V=\{1,2,3\}$ et $E=\{\{1,3\}\}$~? +\item $V=\mathbb{N}$ et $E=\{(1,3)\}$~? +\end{enumerate} +\end{exo} + +{\bf Sauf mention contraire, tous les graphes étudiés dans ce polycopié + seront des graphes finis orientés, que nous appellerons simplement {\it + graphes} par la suite.} + +Un graphe se représente souvent par un dessin où les sommets sont des points +(parfois entourés d'un cercle) et les arêtes des flèches~: si $(x,y)$ est +une arête, on dessine une flèche entre $x$ et $y$. Par exemple le graphe +$$(\{1,2,3,4\},\{(1,1),(1,2),(3,1),(2,4),(3,4)\})$$ peut se dessiner comme sur la +figure~\ref{fig:g1}. Comme on peut le voir, il n'y a pas unicité de la façon +de dessiner un graphe. + +\begin{figure}[h] +\begin{center} +\subfigure[première possibilité]{ +\begin{tikzpicture} +\node (1) at (0,0) {$1$}; +\node (2) at (4,0) {$2$}; +\node (3) at (2,-0.7) {$3$}; +\node (4) at (2,0.7) {$4$}; +\path[->,>=triangle 90] (1) edge[loop above] node [above] {} (); +\path[->,>=triangle 90] (1) edge[] node [above] {} (2); +\path[->,>=triangle 90] (3) edge[] node [above] {} (4); +\path[->,>=triangle 90] (3) edge[] node [above] {} (1); +\path[->,>=triangle 90] (2) edge[] node [above] {} (4); +\end{tikzpicture} +}\hspace*{3cm} +\subfigure[deuxième possibilité]{ +\begin{tikzpicture} + +\node (1) at (0,0) {$1$}; +\node (2) at (3,0) {$2$}; +\node (3) at (2,-0.7) {$3$}; +\node (4) at (5,-0.7) {$4$}; +\path[->,>=triangle 90] (1) edge[loop above] node [above] {} (); +\path[->,>=triangle 90] (1) edge[] node [above] {} (2); +\path[->,>=triangle 90] (3) edge[] node [above] {} (4); +\path[->,>=triangle 90] (3) edge[] node [above] {} (1); +\path[->,>=triangle 90] (2) edge[] node [above] {} (4); +\end{tikzpicture} +} +\end{center} +\caption{Représentation d'un graphe}\label{fig:g1} +\end{figure} + + +\begin{exo} +Dessiner les graphes suivants. +\begin{enumerate} +\item $V=\{1,2,3,4,5\}$ et $E=\{(1,2),(2,1),(3,4),(4,4),(4,5),(5,3)\}$. +\item $V=\{1,2,3,4,5\}$ et $E=\{(1,4),(4,1),(3,4),(4,4),(4,5),(5,3)\}$. +\end{enumerate} +Donner sous forme ensembliste ($V$ et $E$) le graphe suivant~: + +\begin{center} +\begin{tikzpicture} +\node (1) at (0,0) {$1$}; +\node (2) at (4,0) {$2$}; +\node (3) at (2,-1) {$3$}; +\node (4) at (2,1) {$4$}; +\path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3); +\path[->,>=triangle 90] (2) edge[] node [above] {} (1); +\path[->,>=triangle 90] (3) edge[bend left] node [above] {} (1); +\path[->,>=triangle 90] (3) edge[] node [above] {} (2); +\path[->,>=triangle 90] (3) edge[] node [above] {} (4); +\path[->,>=triangle 90] (4) edge[] node [above] {} (2); +\end{tikzpicture} +\end{center} + +Le dessin ci-dessous représente-t-il un graphe~? Si oui le donner +explicitement, sinon dire pourquoi. + +\begin{center} +\begin{tikzpicture} +\node (1) at (0,0) {$1$}; +\node (2) at (4,0) {$2$}; +\node (3) at (2,-1) {$3$}; +\node (4) at (2,1) {$4$}; +\path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3); +\path[->,>=triangle 90] (2) edge[] node [above] {} (1); +\path[->,>=triangle 90] (1) edge[bend right] node [above] {} (3); +\path[->,>=triangle 90] (3) edge[] node [above] {} (2); +\path[->,>=triangle 90] (3) edge[] node [above] {} (4); +\path[->,>=triangle 90] (4) edge[] node [above] {} (2); +\end{tikzpicture} +\end{center} + + +\end{exo} + + +Dans un graphe, les {\bf voisins} d'un sommet $x$ sont tous les sommets $y$ +tels que $(x,y)$ soit dans~$E$. + +\begin{exo} +Pour le graphe de la figure~\ref{fig:grapheexo1}, quels +sont les voisins de $3$~? de $7$~? Quels sommets ont $9$ pour voisin~? +\begin{figure}[h] +\begin{tikzpicture}[scale = 0.8] +\node (0) at (-2,-1) {0}; + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; + +\node (6) at (0,-2) {6}; +\node (7) at (3,-2) {7}; +\node (8) at (6,-2) {8}; +\node (9) at (9,-2) {9}; +\node (10) at (12,-2) {10}; + +\node (11) at (15,0) {11}; +\node (12) at (15,-2) {12}; + +\node (13) at (0,-4) {13}; +\node (14) at (3,-4) {14}; +\node (15) at (6,-4) {15}; +\node (16) at (9,-4) {16}; +\node (17) at (12,-4) {17}; +\node (18) at (15,-4) {18}; + + + +\path[->,>=triangle 90] (0) edge[] node [swap] {} (1); +\path[->,>=triangle 90] (0) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3); + +\path[->,>=triangle 90] (1) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (6); + +\path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2); + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); + +\path[->,>=triangle 90] (4) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (11); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (12); +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); + + + +\path[->,>=triangle 90] (6) edge[] node [swap] {} (14); +\path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9); + +\path[->,>=triangle 90] (7) edge[] node [swap] {} (13); +\path[->,>=triangle 90] (7) edge[] node [swap] {} (15); + + +\path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10); + +\path[->,>=triangle 90] (8) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (14); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (15); + +\path[->,>=triangle 90] (9) edge[] node [swap] {} (3); +\path[->,>=triangle 90] (9) edge[] node [swap] {} (8); +\path[->,>=triangle 90] (9) edge[] node [swap] {} (16); + +\path[->,>=triangle 90] (10) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (10) edge[] node [swap] {} (5); +\path[->,>=triangle 90] (10) edge[] node [swap] {} (17); + +\path[->,>=triangle 90] (12) edge[] node [swap] {} (10); + +\path[->,>=triangle 90] (13) edge[] node [swap] {} (0); +\path[->,>=triangle 90] (16) edge[] node [swap] {} (17); +\path[->,>=triangle 90] (17) edge[] node [swap] {} (18); +\path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16); + +\end{tikzpicture} +\caption{Graphe 1}\label{fig:grapheexo1} +\end{figure} + +\end{exo} + + + +\begin{exo} +On considère la fonction $f$ de $\{0,\ldots,7\}$ dans $\{0,\ldots,7\}$ qui à +$x$ associe son reste modulo $3$. Dessiner le graphe où $V=\{0,\ldots,7\}$ et +$(x,y)\in E$ si et seulement si $y=f(x)$. Mêmes question avec $(x,y)\in E$ +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$. +\end{exo} + +\begin{exo} +On considère $V=\{maison, voiture, poisson, porte, cartable, grue\}$ et +$(x,y)\in E$ si et seulement $x$ est avant $y$ dans l'ordre du dictionnaire. +Dessiner le graphe $(V,E)$. +Même question mais cette fois ci $(x,y)\in E$ si et seulement $x$ et +$y$ ont au moins deux lettres en commun. +\end{exo} + +\begin{exo} +Soit $G=(V,E)$ un graphe. Comment voit-on sur un dessin de $G$ que la relation +$E$ est une application bijective~? que la relation $E$ est transitive~? +réflexive~? +\end{exo} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Chemins, boucles et circuits} + + +Soit $G=(V,E)$ un graphe. Un {\bf chemin} est une suite finie +$(x_1,x_2),(x_2,x_3),\ldots,(x_{n},x_{n+1})$ d'arêtes consécutives. L'entier +$n$ est appelé {\bf taille} ou {\bf longueur} du chemin. Le sommet $x_1$ est l'{\bf origine} +du chemin et $x_n$ sa {\bf destination}. On dit aussi que ce chemin part de +$x_1$ pour arriver en $x_n$. +Dans le graphe de la figure~\ref{fig:grapheexo1}, $(0,1),(1,2),(2,6)$ est un +chemin partant de $0$, arrivant en $6$ et de longueur $3$. Par convention, +de tout point part un chemin vers lui même de longueur $0$ (qui n'utilise +aucune arête). + + +Une {\bf boucle} est un chemin dont le sommet d'origine est aussi le sommet +d'arrivée. Une boucle qui ne passe pas deux fois par le même sommet (sauf à +l'origine et à la destination) est appelé un {\bf circuit}. Dans le graphe +de la figure~\ref{fig:grapheexo1}, $(5,12),(12,10),(10,5)$ est un circuit. +Le chemin +$$(0,1),(1,7)(7,13)(13,0),(0,3),(3,7),(7,13),(13,0)$$ +est une boucle mais n'est pas un circuit. +Un chemin qui ne passe jamais deux fois par le même sommet est dit {\bf sans + boucle}. + + +\begin{exo} +Dans le graphe de la figure~\ref{fig:grapheexo1} donner +\begin{enumerate} +\item Un circuit de taille $1$, +\item Une boucle de longueur $9$ passant par $4$, +\item Un chemin sans boucle de $0$ à $18$, +\item Un chemin sans boucle de taille au moins $10$. +\end{enumerate} +\end{exo} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ùù +\section{Graphe et modélisation} + +L'objectif de ce chapitre est de voir comment passer d'un problème concret à +un problème de graphe. + +\begin{exo} +On considère le plan ci-dessous d'un musée. La porte d'entrée est en bas à +gauche. + +\bigskip + +\begin{tikzpicture} + +\draw (0,0) rectangle +(6,4); +\draw (0,0) rectangle +(1.5,1); +\draw (0,0) rectangle +(1.5,2); +\draw (0,0) rectangle +(1.5,3); +\draw (0,0) rectangle +(1.5,4); +\draw (1.5,2) rectangle +(1.5,2); +\draw (1.5,1) rectangle +(3,3); +\draw (0,0) rectangle +(4.5,1); + +\draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ; +\draw (0.5,0.9) [fill=white]rectangle +(0.5,.2); +\draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2); +\draw (2,1-0.1) [fill=white]rectangle +(0.5,.2); + + +\draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5); +\draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5); +\draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5); +\draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5); +\draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5); +\draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5); +\end{tikzpicture} + +\begin{enumerate} +\item Représenter sous forme de graphe ce musée, en mettant un sommet par + salle. +\item On suppose qu'un gardien peut surveiller la salle dans laquelle il se + trouve ainsi que les salles voisines. Combien faut-il de gardiens au + minimum~? +Formuler ce problème, d'une manière générale, dans le vocabulaire des +graphes. + +\item Un groupe de visiteurs souhaite admirer toutes les salles du musée. +Peut-il le faire sans jamais passer deux fois par la même salle (on ne +compte pas le chemin de retour; le groupe peut partir de n'importe quelle +salle aussi)~? Proposer une formulation générale de ce +problème en utilisant le vocabulaire des graphes. + +\item Le soir, le conservateur souhaite avant de fermer le musée passer dans + toutes les salles puis ressortir, tout en minimisant le trajet (il part de + l'entrée et ressort par l'entrée/sortie). Quel + chemin doit-il prendre~? Formuler ce problème de façon général en + utilisant le vocabulaire des graphes. + +\end{enumerate} + +\end{exo} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{exo} +On considère un ensemble fini $V$ de joueurs de tennis, et le graphe orienté +$(V,E)$ tel que $(x,y)\in E$ si et seulement si $x$ a déjà gagné un match +contre $y$. Donner des formulations dans le vocabulaire de la théorie des +graphes des propriétés suivantes. + +\begin{enumerate} +\item Il y a un joueur qui n'a jamais perdu. +\item Il y a un joueur qui n'a jamais gagné. +\item Un joueur ne joue jamais contre lui-même. +\item Tous les joueurs ont déjà joué au moins un match conte un autre + joueur. +\item Il y a un joueur qui a déjà joué contre tout le monde. +\item Il y a un joueur qui a déjà gagné contre tout le monde. +\item Il y a un joueur qui a joué contre tout le monde et perdu tous + ses matchs. +\end{enumerate} +\end{exo} + +\begin{exo} +On considère un graphe représentant la carte d'une ville~: chaque n\oe{}ud est +un croisement, chaque arête un tronçon de rue, codant le sens de +circulation. On considère de plus que les neouds sont coloriés, en rouge +(s'il y a un feu de signalisation au croisement) ou en bleu (s'il n'y a pas +de feu). +Exprimer, dans le vocabulaire de la théorie des graphes les +propriétés suivantes. + +\begin{enumerate} +\item Il n'y a pas de sens unique. +\item Il n'y a pas d'impasse. +\item De n'importe où, je peux aller partout. +\item De n'importe où, je peux aller partout en passant par au plus trois + feux de signalisation. +\item Deux croisements consécutifs ne peuvent avoir tout deux des feux. +\item Il n'y a jamais plus de deux rues qui se croisent à la fois. +\item Il n'y a ni pont, ni tunnel. +\end{enumerate} +\end{exo} + +\begin{exo} +On considère le graphe $G$ dont les sommets sont les configurations possible +d'un rubics cube, et il y a une arête entre deux configurations si l'on peut +passer de l'une à l'autre en jouant un coup (c'est-à-dire une rotation d'un +quart de tour d'un coté). Exprimer avec le vocabulaire de la théorie des +graphes les propriétés suivantes (on ne cherche pas à savoir si elles sont +vraies ou fausse)~: +\begin{itemize} +\item Il y a toujours une solution. +\item A partir de certaines configurations, il n'y a pas de solution. +\item De toute position, si je modifie le cube, je peux revenir à cette + position. +\item Il existe une position dans laquelle je peux résoudre le rubics cube, + mais pas en moins de 30 coups. +\item Si dans une position je peux résoudre le rubics cube, alors je peux le + résoudre en moins de 30 coups. +\end{itemize} +\end{exo} + + +\begin{exo} +On considère un ensemble de $n$ enfants portant chacun un dossard différent, +numéroté de $1$ à $n$, et jouant à cache-cache. On considère le graphe dont +les sommets sont les entiers de $1$ à $n$ et il y a une arête entre $i$ et +$j$ si l'enfant avec le dossard $i$ peut voir l'enfant avec le dossard $j$. +Exprimer dans le vocabulaire de la théorie des graphes les propriétés +suivantes~: + +\begin{enumerate} +\item Il y a un enfant bien caché qu'aucun autre ne peut voir. +\item Il y a un enfant qui ne voit personne. +\item Un enfant se voit toujours lui-même. +\item Il y a deux enfants qui se voient l'un l'autre. +\item Tout enfant voit au moins un autre enfant. +\end{enumerate} +\end{exo} + + +\begin{exo} +Un homme se trouve au bord d'une rivière avec un choux, une chèvre et loup. +Il possède une barque et veut traverser la rivière. Cependant, il ne peut +mettre en même temps, en plus de lui, dans la barque qu'un des trois. Et, +malheureusement aussi, il ne peut laisser sur une rive seul le loup avec la +chèvre, ni la chèvre avec le choux. + + +Modéliser le problème avec un graphe et proposer une solution. +\end{exo} + +\begin{exo} +On considère un site Web statique, installé sur un serveur. On se pose les +questions suivantes, liées à l'ergonomie du site~: +\begin{enumerate} +\item Puis-je à l'aide de la souris uniquement accéder à toutes les pages du + site à partir de la page d'accueil~? +\item Puis-je toujours en un clic retourner à la page d'accueil~? +\item Puis-je, à partir de n'importe quelle page, accéder à n'importe quelle + autre page en moins de 3 clics~? +\end{enumerate} + +Proposer une modélisation de cette situation par un graphe, puis décrire des +algorithmes pour répondre aux questions posées. + +\end{exo} + + + +\begin{figure}[t] +\begin{tikzpicture} + +\draw (0,0) rectangle +(6,4); +\draw (0,0) rectangle +(1.5,1); +\draw (0,0) rectangle +(1.5,2); +\draw (0,0) rectangle +(1.5,3); +\draw (0,0) rectangle +(1.5,4); +\draw (1.5,2) rectangle +(1.5,2); +\draw (1.5,1) rectangle +(3,3); +\draw (0,0) rectangle +(4.5,1); + +\draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ; +\draw (0.5,0.9) [fill=white]rectangle +(0.5,.2); +\draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2); +\draw (2,1-0.1) [fill=white]rectangle +(0.5,.2); + + +\draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5); +\draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5); +\draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5); +\draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5); +\draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5); +\draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5); +\end{tikzpicture} +\caption{Plan du musée 1}\label{m1} +\end{figure} + + +\begin{exo} +On considère le musée décrit dans la figure~\ref{m1}. Le directeur +souhaite, pour une exposition exceptionnelle, placer un gardien dans chaque +salle. Il recrute pour cela des gardiens espagnols (qui ne parlent que +l'espagnol) et des gardiens italiens (qui ne parlent qu'italien). Afin qu'il +ne discutent pas entre eux, il ne veut pas que deux gardiens de la même +nationalité soient dans des salles voisines. Est-ce possible~? + +\bigskip +Même question avec le musée de la figure~\ref{m2}. + +\begin{figure}[h] +\begin{tikzpicture} + +\draw (0,0) rectangle +(6,4); +\draw (0,0) rectangle +(1.5,1); +\draw (0,0) rectangle +(1.5,2); +\draw (0,0) rectangle +(1.5,3); +\draw (0,0) rectangle +(1.5,4); +\draw (1.5,2) rectangle +(1.5,2); +\draw (1.5,1) rectangle +(3,3); +\draw (0,0) rectangle +(4.5,1); + +\draw (0.5,-0.1) [fill=white]rectangle +(0.5,.2) ; +\draw (0.5,0.9) [fill=white]rectangle +(0.5,.2); +\draw (0.5,3-0.1) [fill=white]rectangle +(0.5,.2); +\draw (2,1-0.1) [fill=white]rectangle +(0.5,.2); + + +\draw (1.5-0.1,0.25) [fill=white]rectangle +(0.2,.5); +%\draw (4.5-0.1,0.25) [fill=white]rectangle +(0.2,.5); +\draw (4.5-0.1,2.25) [fill=white]rectangle +(0.2,.5); +\draw (3-0.1,2.75) [fill=white]rectangle +(0.2,.5); +%\draw (1.5-0.1,3.25) [fill=white]rectangle +(0.2,.5); +\draw (1.5-0.1,2.25) [fill=white]rectangle +(0.2,.5); +\end{tikzpicture} +\caption{Plan du musée 2}\label{m2} +\end{figure} + +\bigskip +Généraliser ce problème sur les graphes. Décrire un algorithme pour le +résoudre~? +\end{exo} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Codage des graphes} + +On s'intéresse maintenant à coder les graphes (en machine). Il y a deux +méthodes principales (qui admettent des variantes), le codage par liste +d'adjacence et le codage par matrice d'adjacence. + + +\subsection{Codage par matrices d'adjacence} + +Soit $G=(V,E)$ un graphe. On suppose, sans perte de généralité, que +$V=\{1,\ldots,n\}$. On appelle {\bf matrice d'adjacence} de $V$ le tableau +(matrice) de taille $n$ sur $n$ ne contenant que des $0$ ou des $1$ et +défini par~: la case de la $i$-ème ligne et de la $j$-ième colonne contient +un $1$ si et seulement si $(i,j)\in E$. + +On considère par exemple le graphe +$(\{1,2,3,4\},\{(1,1),(1,2),(3,1),(2,4),(3,4)\})$ dessiné sur la +figure~\ref{fig:g1}. Sa matrice d'adjacence est +$$\left( +\begin{array}{cccc} +1 & 1 & 0 & 0\\ +0 & 0 & 0 & 1\\ +1 & 0 & 0 & 1\\ +0 & 0 & 0 & 0 +\end{array} +\right). +$$ + +Réciproquement, le graphe dont la matrice d'adjacence est +$\left( +\begin{array}{cccc} +0 & 0 & 1 & 0\\ +1 & 0 & 0 & 0\\ +1 & 1 & 0 & 1\\ +0 & 1 & 0 & 0 +\end{array} +\right) +$ est le graphe ci-dessous~: +\bigskip + +\begin{center} +\begin{tikzpicture} +\node (1) at (0,0) {$1$}; +\node (2) at (4,0) {$2$}; +\node (3) at (2,-1) {$3$}; +\node (4) at (2,1) {$4$}; +\path[->,>=triangle 90] (1) edge[bend left] node [above] {} (3); +\path[->,>=triangle 90] (2) edge[] node [above] {} (1); +\path[->,>=triangle 90] (3) edge[bend left] node [above] {} (1); +\path[->,>=triangle 90] (3) edge[] node [above] {} (2); +\path[->,>=triangle 90] (3) edge[] node [above] {} (4); +\path[->,>=triangle 90] (4) edge[] node [above] {} (2); +\end{tikzpicture} +\end{center} + + +\begin{exo} +Dessiner le graphe dont la matrice d'adjacence est $\left( +\begin{array}{cccccc} +1 & 1 & 1 & 0 & 0 & 0\\ +1 & 0 & 1 & 0 & 1 & 0\\ +0 & 1 & 1 & 0 & 0 & 1\\ +0 & 1 & 0 & 0 & 1 & 1\\ +1 & 0 & 0 & 0 & 0 & 0\\ +0 & 0 & 1 & 1 & 0 & 0\\ +\end{array} +\right)$. + +\noindent +Quel est la matrice d'adjacence du graphe où $V=\{1,\ldots,7\}$ et +$$E=\{(1,2),(4,2),(3,5),(7,1),(6,4),(1,5),(5,0) \}~?$$ +\end{exo} + +\begin{exo} +Soit $(V,E)$ un graphe. Comment lit-on sur la matrice d'adjacence de ce +graphe que la relation $E$ est réflexive~? symétrique~? antisymétrique~? +\end{exo} + + +\begin{exo} +Pour tout graphe orienté $G$, on note $G^R$ le graphe défini par~: les +sommets de $G^R$ sont les mêmes que ceux de $G$ et $(x,y)$ est une arête de + $G^R$ si et seulement si $(y,x) $ est une arête de $G$. Le graphe $G^R$ +s'appelle {\it miroir} de $G$. + +\begin{figure}[h] +\begin{center} +\begin{tikzpicture}[scale=0.7] +\node (1) at (0,0) [draw,state] {$1$}; +\node (2) at (3,0) [draw,state] {$2$}; +\node (3) at (6,0) [draw,state] {$3$}; +\node (4) at (9,0) [draw,state] {$4$}; +\path[->,thick,draw] (1) -- (2); +\path[->,thick,draw] (2) -- (3); +\path[->,thick,draw] (3) edge[out=-45] node [swap] {} (4); +\path[->,thick,draw] (4) edge[out=-135,in=45] node [swap] {} (3); +\path[->,thick,draw] (1) edge[loop above] node [] {} (1); +\end{tikzpicture} +\end{center} +\caption{}\label{fig-exo1} +\end{figure} + +\begin{enumerate} +\item Dessiner le graphe miroir du graphe de la figure~\ref{fig-exo1}. +\item Soit $A$ la matrice d'adjacence d'un graphe $G$. Quelle est la matrice + d'adjacence de $G^R$, en fonction de $A$~? +\item Justifier que $(G^R)^R=G$ pour tout graphe $G$. +\item Justifier que si $G$ contient une boucle de longueur $k$, alors $G^R$ + aussi. +\end{enumerate} + +\end{exo} + +\subsection{Codage par liste d'adjacence} + +Le codage d'un graphe par liste d'adjacence consiste à coder, pour chaque +sommet du graphe, l'ensemble de ses voisins par une liste {\it + triée}\footnote{Attention, le fait qu'elle soit triée n'est pas toujours + imposé dans la littérature, mais c'est le choix que nous prendrons.}. +On considère encore que $V=\{1,\ldots,n\}$. On dispose alors d'un tableau de +taille $n$ dont la première case contient la liste des voisins de $1$, la +seconde la liste des voisins de $2$, etc. + +Par exemple, le graphe de la figure~\ref{fig:g1} se code par le tableau de +liste~: + +\medskip +\begin{center} +\begin{tikzpicture} +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (1) at (0,0) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (2) at (0,-0.5) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (3) at (0,-1) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (4) at (0,-1.5) {}; +\node (1a) at (0,0) {}; +\node (2a) at (0,-0.5) {}; +\node (3a) at (0,-1) {}; +\node (4a) at (0,-1.5) {}; + + +\node (11) at (1,0) {$1$}; +\node (12) at (2,0) {$2$}; +\node (13) at (4,0) {NULL}; + +\node (21) at (1,-0.5) {$4$}; +\node (22) at (3,-0.5) {NULL}; + +\node (31) at (1,-1) {$1$}; +\node (32) at (2,-1) {$4$}; +\node (33) at (4,-1) {NULL}; + +\node (41) at (2,-1.5) {NULL}; +\path[->,>=triangle 90] (1a) edge[] node [above] {} (11); +\path[->,>=triangle 90] (11) edge[] node [above] {} (12); +\path[->,>=triangle 90] (12) edge[] node [above] {} (13); + +\path[->,>=triangle 90] (2a) edge[] node [above] {} (21); +\path[->,>=triangle 90] (21) edge[] node [above] {} (22); + +\path[->,>=triangle 90] (3a) edge[] node [above] {} (31); +\path[->,>=triangle 90] (31) edge[] node [above] {} (32); +\path[->,>=triangle 90] (32) edge[] node [above] {} (33); +\path[->,>=triangle 90] (4a) edge[] node [above] {} (41); + + +\end{tikzpicture} +\end{center} + + +\begin{exo} +Dessiner le graphe dont la représentation par liste d'adjacence est~: + +\medskip +\begin{center} +\begin{tikzpicture} +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (1) at (0,0) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (2) at (0,-0.5) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (3) at (0,-1) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (4) at (0,-1.5) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (5) at (0,-2) {}; +\node[draw,minimum width=0.5cm,minimum height=0.5cm] (6) at (0,-2.5) {}; +\node (1a) at (0,0) {}; +\node (2a) at (0,-0.5) {}; +\node (3a) at (0,-1) {}; +\node (4a) at (0,-1.5) {}; +\node (5a) at (0,-2) {}; +\node (6a) at (0,-2.5) {}; + + +\node (11) at (1,0) {$2$}; +\node (12) at (2,0) {$5$}; +\node (13) at (4,0) {NULL}; + +\node (21) at (1,-0.5) {$3$}; +\node (22) at (3,-0.5) {NULL}; + +\node (31) at (1,-1) {$1$}; +\node (32) at (2,-1) {$4$}; +\node (33) at (3,-1) {$5$}; +\node (34) at (4,-1) {$6$}; +\node (35) at (6,-1) {NULL}; + +\node (41) at (1,-1.5) {$2$}; +\node (42) at (3,-1.5) {NULL}; + +\node (51) at (2,-2) {NULL}; + + +\node (61) at (1,-2.5) {$2$}; +\node (62) at (2,-2.5) {$3$}; +\node (63) at (3,-2.5) {$4$}; +\node (64) at (4,-2.5) {$6$}; +\node (65) at (6,-2.5) {NULL}; +\path[->,>=triangle 90] (1a) edge[] node [above] {} (11); +\path[->,>=triangle 90] (11) edge[] node [above] {} (12); +\path[->,>=triangle 90] (12) edge[] node [above] {} (13); + +\path[->,>=triangle 90] (2a) edge[] node [above] {} (21); +\path[->,>=triangle 90] (21) edge[] node [above] {} (22); + +\path[->,>=triangle 90] (3a) edge[] node [above] {} (31); +\path[->,>=triangle 90] (31) edge[] node [above] {} (32); +\path[->,>=triangle 90] (32) edge[] node [above] {} (33); +\path[->,>=triangle 90] (33) edge[] node [above] {} (34); +\path[->,>=triangle 90] (34) edge[] node [above] {} (35); + + +\path[->,>=triangle 90] (4a) edge[] node [above] {} (41); +\path[->,>=triangle 90] (41) edge[] node [above] {} (42); + + +\path[->,>=triangle 90] (5a) edge[] node [above] {} (51); + + +\path[->,>=triangle 90] (6a) edge[] node [above] {} (61); +\path[->,>=triangle 90] (61) edge[] node [above] {} (62); +\path[->,>=triangle 90] (62) edge[] node [above] {} (63); +\path[->,>=triangle 90] (63) edge[] node [above] {} (64); +\path[->,>=triangle 90] (64) edge[] node [above] {} (65); + +\end{tikzpicture} +\end{center} + + +\end{exo} + +\begin{exo} +Dessiner la représentation par liste d'adjacence du graphe de la +figure~\ref{fig:grapheexo1}. +\end{exo} + + +\begin{exo}\label{titi} +On considère que l'on code en Python un graphe par liste d'adjacence de la +manière suivante~: +\begin{itemize} +\item Un graphe un un couple de la forme $(V,E)$, +\item $V$ est une liste d'éléments tous différents, triés, +\item $E$ est un dictionnaire qui à chaque élément de $V$ associe la liste + triée de ses voisins. +\end{itemize} + + +\begin{enumerate} +\item Dessiner le graphe correspondant à \\ +{\tt ([1,2,3],\{1:[2],2:[2,3],3:[1,3]\})} +\item Écrire une fonction qui teste si un coupe $(V,E)$ où $V$ est une liste + d'entiers et $E$ un dictionnaire, représente bien un graphe par liste + d'adjacence. + +\item Écrire une fonction qui compte le nombre d'arêtes d'un graphe. + +\item Écrire une fonction qui teste si $(i,j)$ est une arête d'un graphe. + +\item On appelle {\it sommet bloquant} un sommet $i$ tel que pour tout + sommet $j$, $(i,j)$ n'est pas une arête. Écrire une fonction qui teste + si un sommet est bloquant. + +\item On appelle {\it sommet puits} un sommet $i$ tel que pour tout + sommet $j\neq i$, $(i,j)$ n'est pas une arête et tel que $(i,i)$ soit + une arête. Écrire une fonction qui teste + si un sommet est un puits. + +\item Écrire une fonction qui ajoute une arête $(i,j)$ à un graphe. + +\item Écrire une fonction qui supprime une arête $(i,j)$ à un graphe (on + rappelle que la méthode {\tt remove} de python retire la première + occurrence d'une valeur donnée en paramètre). + +\end{enumerate} + +\end{exo} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{Parcours de Graphes} + +L'exercice suivant est une introduction aux parcours de graphes. + +\begin{exo} +On considère le graphe de la figure~\ref{fig:zomb}. Il y a une flèche entre +$x$ et $y$ si $x$ connaît l'adresse de $y$. On considère aussi que certains +individus dans cette liste peuvent être des zombies. +\begin{enumerate} +\item On considère que chaque nuit, un zombie va mordre et donc transformer + en zombie des individus dont il connaît l'adresse et qui ne sont pas encore + zombies. Si c'est possible, chaque zombie transforme au moins + un zombie par nuit. En supposant qu'au départ seule Karina est un zombie, + donner quelques possibilités indiquant, in fine, qui zombifie qui? + Dessiner les solutions à l'aide d'un graphe où $(x,y)$ est une arête si + $x$ a zombifié $y$. + +\item On considère maintenant que chaque nuit, chaque zombie va transformer + tous les individus dont il connaît l'adresse et qui ne sont pas encore + zombies. En supposant qu'au départ seule Karina est un zombie, + donner quelques possibilités indiquant, in fine, qui zombifie qui? + +\item On suppose maintenant que chaque zombie doit non seulement transformer + tous les individus dont il connaît l'adresse et qui ne sont pas encore + zombies, mais aussi dans l'ordre croissant de leur numéros. Par exemple, + Karina transformera dans l'ordre Raph, Mike puis David. On suppose de plus + que chaque nuit les zombies vont mordre à tour de rôle, en commençant par + celui qui à été transformé en zombies le plus anciennement. En supposant + qu'au départ seule Karina est un zombie. Écrire qui zombifie qui, et dans + quel ordre. + +\item On suppose maintenant que chaque nuit, un zombie dont aucun voisin + (au sens des graphes) + n'est zombie va mordre le premier (par ordre de numéro) des individus non + zombies qu'il connaît qui n'est pas encore zombie. Un zombie qui a au moins + un voisin zombie ne fait rien la nuit, il attend. Un zombie dont tous les + voisins sont devenus eux aussi des zombies se transforme en poussière. + En supposant + qu'au départ seule Karina est un zombie, Écrire qui a zombifié qui, et dans + quel ordre. + + +\end{enumerate} + +\begin{figure}[h] +\begin{center} +\begin{tikzpicture} + +\node (1) at (0,0) {Raph (1)}; +\node (2) at (-2,-2) {Jeff (2)}; +\node (3) at (0,-3) {Peter (3)}; +\node (4) at (2,-2) {Chris (4)}; +\node (5) at (0,2) {Mike (5)}; +\node (6) at (-3,2) {Karina (6)}; +\node (7) at (-3,0) {David (7)}; +\node (8) at (3,0) {John-Claude (8)}; + +\path[->,>=triangle 90] (6) edge[] node [above] {} (5); +\path[->,>=triangle 90] (6) edge[] node [above] {} (7); +\path[->,>=triangle 90] (6) edge[] node [above] {} (1); + +\path[->,>=triangle 90] (1) edge[] node [above] {} (5); +\path[->,>=triangle 90] (1) edge[] node [above] {} (7); +\path[->,>=triangle 90] (1) edge[] node [above] {} (8); +\path[->,>=triangle 90] (1) edge[] node [above] {} (2); + +\path[->,>=triangle 90] (4) edge[] node [above] {} (1); + +\path[->,>=triangle 90] (5) edge[] node [above] {} (8); +\path[->,>=triangle 90] (8) edge[] node [above] {} (4); +\path[->,>=triangle 90] (2) edge[] node [above] {} (3); +\path[->,>=triangle 90] (2) edge[] node [above] {} (4); +\path[->,>=triangle 90] (3) edge[] node [above] {} (4); +\path[->,>=triangle 90] (3) edge[] node [above] {} (1); + + +\end{tikzpicture} +\end{center} +\caption{Graphe des connaissances}\label{fig:zomb} +\end{figure} +\end{exo} + + +Les graphes obtenus dans les questions de l'exercice précédent s'appellent +des {\it arbres couvrants}. La façon de procéder de la question~3 s'appelle +{\it parcours en largeur} et celle de la question~4 s'appelle {\it parcours + en profondeur}. + + +\section{Arbres couvrants} + +\subsection{Arbres} + + +Un {\bf arbre} est un graphe $G=(V,E)$ tel que~: +\begin{enumerate} +\item[(1)] Il n'y a pas de boucle de longueur non nulle dans $G$ (on dit que $G$ + est acyclique). + +\item[(2)] Si $(x,y)$ et $(z,y)$ sont dans $E$, alors $x=z$. + +\item[(3)] Il existe un sommet $x_0$, appelé {\bf racine}, tel que pour + tout sommet $y$, il existe une chemin de $x_0$ à $y$. +\end{enumerate} + +Un exemple d'arbre dont la racine est $1$ est dessiné sur la +figure~\ref{fig:arbre}. + +\begin{exo} +Dessiner trois arbres différents à 6 sommets. +\end{exo} + + +\begin{exo} +Dessiner un graphe qui vérifie $(1)$ et $(2)$ de la définition mais qui +n'est pas un arbre. Même question avec $(2)$ et $(3)$. Même question avec +$(3)$ et $(1)$. +\end{exo} + +\medskip +Dans un arbre, on utilise à la fois une terminologie de type +\og {\it végétal}\fg{} et +aussi +de type \og {\it arbre généalogique}\fg{}. +On appelle {\bf feuille} tout sommet d'un arbre qui n'a pas de voisin. Tout +chemin de la racine à une feuille est appelée {\bf branche}. Les voisins +d'un noeud sont appelés ses {\bf fils}. +Tous les sommets atteignables depuis un sommet $x$ sont dits les {\bf + descendants} de $x$ et ils constituent le {\bf sous-arbre} enraciné en $x$. +Si $y$ est atteignable depuis $x$, alors $x$ est un {\bf ancêtre} de $y$. +Si $y$ est un voisin de $x$, alors $x$ est le {\bf père} de $y$. Deux sommets +qui ont le même père sont {\bf frères}. +Par exemple, dans le dessin de la figure~\ref{fig:arbre}, +$6$ est le père de $7$, $3$ est un frère de $2$ et $5$ est une descendant de +$1$. + +\begin{figure} +\begin{center} +\begin{tikzpicture}[scale=0.6] +\node (1) at (0,0) {$1$}; +\node (2) at (-3,-2) {$2$}; +\node (3) at (3,-2) {$3$}; + +\node (5) at (-2,-4) {$5$}; +\node (4) at (-3,-4) {$4$}; +\node (6) at (3,-4) {$6$}; + +\node (7) at (1,-6) {$7$}; +\node (8) at (2,-6) {$8$}; +\node (9) at (3,-6) {$9$}; + + +\path[->,>=triangle 90] (1) edge[] node [above] {} (2); +\path[->,>=triangle 90] (1) edge[] node [above] {} (3); +\path[->,>=triangle 90] (2) edge[] node [above] {} (5); +\path[->,>=triangle 90] (2) edge[] node [above] {} (4); +\path[->,>=triangle 90] (3) edge[] node [above] {} (6); +\path[->,>=triangle 90] (6) edge[] node [above] {} (7); +\path[->,>=triangle 90] (6) edge[] node [above] {} (8); +\path[->,>=triangle 90] (6) edge[] node [above] {} (9); +\end{tikzpicture} +\end{center} +\caption{Exemple d'arbre}\label{fig:arbre} +\end{figure} + + +\begin{exo} +Dans le graphe de la figure~\ref{fig:arbre}, quels sont les descendants de +$3$? Les fils de $1$? Les ancêtres de $6$? les feuilles? +\end{exo} + + +% \begin{exo} +% On considère dans cet exercice des arbres codés par liste d'adjacence comme +% dans l'exercice en Python de la page~\pageref{titi}. On suppose que la +% racine est le premier sommet de la liste $V$. + +% \begin{enumerate} +% \item Écrire une fonction qui compte le nombre de feuille d'un arbre. +% \item Écrire une fonction qui compte le nombre de descendants d'un sommet +% donné. +% \end{enumerate} +% \end{exo} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Parcours d'arbres} + + +Parcourir un arbre, c'est appliquer un algorithme qui va visiter, une et une +seule fois chaque sommet de l'arbre. Les deux parcours les plus connus, sont +les parcours préfixes et suffixes. A chaque visite de noeud, une fonction +{\tt Traiter} est appliquée, selon ce que l'on souhaite faire. + +Le parcours Préfixe est l'algorithme récursif suivant. Initialement, le +parcours est lancé à la racine. + +\begin{verbatim} +Parcours-Prefixe(V,E,x): + Traiter(x) + Pour chaque fils f de x: + Parcours-Prefixe(V,E,f) + FinPour +\end{verbatim} + +Si l'on applique {\tt Parcours-Prefixe} en $1$ sur l'arbre de la +figure~\ref{fig:arbre}, avec pour fonction {\tt Traiter} la fonction qui +affiche la valeur du sommet on obtient. + +$1$ {\tt Parcours-Prefixe(2)} {\tt Parcours-Prefixe(3)} \hspace{2cm} (sommets +dans l'ordre) + +\noindent +Or {\tt Parcours-Prefixe(2)} retourne + +$2$ {\tt Parcours-Prefixe(4)} {\tt Parcours-Prefixe(5)} \hspace{2cm} et +donc retourne + +$2$ $4$ $5$ + + +\noindent +De même {\tt Parcours-Prefixe(3)} retourne + +$3$ $6$ $7$ $8$ $9$ + +\noindent +Et donc {\tt Parcours-Prefixe(1)} retourne + +$1$ $2$ $4$ $5$ $3$ $6$ $7$ $8$ $9$ + + +\begin{exo} +Que retourne l'algorithme de parcours préfixe sur l'arbre de la figure~\ref{fig:arbre2}. + + +\begin{figure} +\begin{center} +\begin{tikzpicture}[scale=0.6] +\node (1) at (0,0) {$1$}; +\node (2) at (3,-2) {$3$}; +\node (3) at (-3,-2) {$2$}; +\node (4) at (4,-4) {$4$}; +\node (5) at (2,-4) {$6$}; +\node (6) at (-3,-4) {$5$}; +\node (7) at (-3,-6) {$7$}; +\node (8) at (-2,-6) {$8$}; +\node (9) at (2,-6) {$9$}; +\node (10) at (3,-6) {$10$}; + + +\path[->,>=triangle 90] (1) edge[] node [above] {} (2); +\path[->,>=triangle 90] (1) edge[] node [above] {} (3); +\path[->,>=triangle 90] (3) edge[] node [above] {} (5); +\path[->,>=triangle 90] (2) edge[] node [above] {} (4); +\path[->,>=triangle 90] (3) edge[] node [above] {} (6); +\path[->,>=triangle 90] (6) edge[] node [above] {} (7); +\path[->,>=triangle 90] (6) edge[] node [above] {} (8); +\path[->,>=triangle 90] (5) edge[] node [above] {} (9); +\path[->,>=triangle 90] (5) edge[] node [above] {} (10); +\end{tikzpicture} +\end{center} +\caption{Arbre}\label{fig:arbre2} +\end{figure} + +\end{exo} + +\medskip +La parcours suffixe est identique à la différence près que le traitement se +fait après l'appel récursif. + +\begin{verbatim} +Parcours-Suffixe(V,E,x): + Pour chaque fils f de x: + Parcours-Suffixe(V,E,f) + FinPour + Traiter(x) +\end{verbatim} + +\begin{exo} +Que donne le parcours suffixe sur les arbres des figures~\ref{fig:arbre} et~\ref{fig:arbre2}? +\end{exo} + +% \begin{exo} +% Avec le même codage que précédemment, écrire en Python des fonctions de +% parcours préfixe et suffixe. +% \end{exo} + +%%%%%%%%%%%%%%%%%%%%% +\subsection{Arbres couvrants} + +Attention, ici, on parle d'arbres couvrants de graphes orientés. + +Soit $G=(V,E)$. Un arbre couvrant pour $G$, enraciné en $x\in V$, est un +arbre $(V^\prime,E^\prime)$ tel que +\begin{enumerate} +\item[(1)] $V^\prime\subseteq V$ et $E^\prime\subseteq E$. +\item[(2)] $x$ est la racine de $(V^\prime,E^\prime)$. +\item[(3)] On ne peut pas rajouter à l'arbre un sommet ou une arête de sorte + que les conditions + $(1)$ et $(2)$ soient toujours vérifiées: l'arbre est maximal. +\end{enumerate} + +Intuitivement un arbre couvrant est un arbre que l'on peut calquer sur un +graphe -- conditions (1) et (2) -- sans pouvoir le prolonger. +Considérons par exemple le graphe de la figure~\ref{fig:graphcouvrant}. + +\begin{figure}[h] +\begin{center} +\begin{tikzpicture}[scale = 0.8] +\node (0) at (-2,-1) {0}; + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; + +\node (6) at (0,-2) {6}; +\node (7) at (3,-2) {7}; +\node (8) at (6,-2) {8}; +\node (9) at (9,-2) {9}; + + + +\path[->,>=triangle 90] (0) edge[] node [swap] {} (1); + +\path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1); + +\path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2); + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); + +\path[->,>=triangle 90] (4) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); + + + +\path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9); + + + +\path[->,>=triangle 90] (8) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (4); + +\path[->,>=triangle 90] (9) edge[] node [swap] {} (3); + +\end{tikzpicture} +\end{center} +\caption{Graphe 1}\label{fig:graphcouvrant} +\end{figure} + +Dans ce graphe, l'arbre de gauche de la figure~\ref{fig:graphcouvrant2} +vérifie bien $(1)$ et $(2)$ mais +pas $(3)$. En revanche celui de droite est bien un arbre couvrant. + + +\begin{figure}[h] +\begin{center} +\subfigure{ +\begin{tikzpicture}[scale = 0.8] +\node (0) at (-2,-1) {0}; + +\node (1) at (0,0) {1}; +\node (2) at (2,0) {2}; +\node (6) at (0,-2) {6}; + +\path[->,>=triangle 90] (0) edge[] node [swap] {} (1); + +\path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (6); + +\end{tikzpicture}}\hspace{1cm} +\subfigure{ + +\begin{tikzpicture}[scale = 0.6] +\node (0) at (-2,-1) {0}; + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; + +\node (6) at (0,-2) {6}; +\node (7) at (3,-2) {7}; +\node (9) at (9,-2) {9}; + + + +\path[->,>=triangle 90] (0) edge[] node [swap] {} (1); + +\path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (7); + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); + + +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); +\path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9); + +\path[->,>=triangle 90] (9) edge[] node [swap] {} (3); + + + +\end{tikzpicture} +} +\end{center} + +\caption{Arbres non couvrant et couvrant}\label{fig:graphcouvrant2} +\end{figure} + +% \begin{exo} +% Écrire une fonction qui étant donné un graphe et un arbre codé en Python +% comme précédemment, teste si l'arbre est un arbre couvrant du graphe (on ne +% testera pas si c'est bien un arbre). +% \end{exo} + + +L'objectif des algorithmes de parcours de graphes est de construire des +arbres couvrants de graphes afin, ensuite, d'appliquer des parcours (type +préfixe/suffixe) sur les arbres obtenus. Il existe deux constructions +d'arbres couvrant très utilisées, appelées {\it parcours en largeur} et {\it + parcours en profondeur}. + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\subsection{Parcours en largeur} + + +On ne donne pas explicitement l'algorithme de parcours en largeur à partir +de $x$ qui +demanderait l'introduction des structures de données. On se contente d'un +pseudo-algorithme expliquant la méthode~: +\begin{enumerate} +\item $x$ est la racine de l'arbre. +\item On insère dans l'arbre tous les voisins de $x$ (sauf éventuellement + $x$), dans l'ordre. +\item On insère (dans l'ordre) dans l'arbre tous les voisins de la feuille + la plus anciennement introduite dans l'arbre et pour laquelle c'est possible. +\item On recommence l'étape précédente tant que c'est possible. +\end{enumerate} + +Si l'on exécute le parcours sur le graphe de la +figure~\ref{fig:graphcouvrant}, en partant du sommet $3$. Après les étapes +$1$ et $2$ on a l'arbre $A_1$ de la figure~\ref{fig:parcourslargeur}. +La feuille introduite le plus anciennement +(attention à l'ordre qui est l'ordre des numéro des sommets) est $2$. On +ajoute donc $1$ et $6$ -- et pas $7$ qui y est déjà. On obtient alors +l'arbre $A_2$ de la figure~\ref{fig:parcourslargeur}. + +\begin{figure}[h] +\begin{center} +\subfigure[$A_1$]{ +\begin{tikzpicture}[scale = 0.6] +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; +\node (7) at (3,-2) {7}; + + + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); +\end{tikzpicture} +} +\subfigure[$A_2$]{ +\begin{tikzpicture}[scale = 0.6] + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; + +\node (6) at (0,-2) {6}; +\node (7) at (3,-2) {7}; + + + +\path[->,>=triangle 90] (2) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1); + + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); + + + + +\end{tikzpicture} +} +\end{center} +\caption{Parcours en largeur}\label{fig:parcourslargeur} +\end{figure} + + +Ensuite, la feuille la plus anciennement introduite est $4$. Son seul voisin +est $9$ qui n'est pas encore dans l'arbre. On obtient donc l'arbre $A_3$ +de la figure~\ref{fig:parcourslargeurA3}. +Ensuite il s'agit du sommet $5$ dont l'unique fils $3$ est déjà dans +l'arbre. La construction n'évolue donc pas pour $5$. Ensuite, on a fini les +fils de $3$, on passe donc aux fils du premier fils de $3$, à savoir $2$. +Les fils de $1$ sont $2$, $6$ et $7$, qui sont déjà dans l'arbre. En +continuant ainsi, on voit qu'il n'y a plus rien à ajouter. On obtient donc +l'arbre de la figure~\ref{fig:parcourslargeurA3} + +\begin{figure}[ht] +\begin{center} +\begin{tikzpicture}[scale = 0.6] + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; + +\node (6) at (0,-2) {6}; +\node (7) at (3,-2) {7}; + +\node (9) at (9,-2) {9}; + + + +\path[->,>=triangle 90] (2) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1); + + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); + +\path[->,>=triangle 90] (4) edge[] node [swap] {} (9); + + + +\end{tikzpicture} +\end{center} +\caption{Parcours en largeur~$A_3$}\label{fig:parcourslargeurA3} +\end{figure} + + +\begin{exo} +\begin{enumerate} +\item Sur le graphe de la figure ci-dessous, dessiner les arbres +obtenus par un parcours en largeur à partir de $2$. Même question en partant +de $6$. Même question en partant de $9$. + +\begin{center} +\begin{tikzpicture}[scale = 0.8] +\node (0) at (-2,-1) {0}; + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; + +\node (6) at (0,-2) {6}; +\node (7) at (3,-2) {7}; +\node (8) at (6,-2) {8}; +\node (9) at (9,-2) {9}; + + + +\path[->,>=triangle 90] (0) edge[] node [swap] {} (1); + +\path[->,>=triangle 90] (1) edge[bend left] node [swap] {} (2); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1); + +\path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2); + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); + +\path[->,>=triangle 90] (4) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); + + + +\path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9); + + + +\path[->,>=triangle 90] (8) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (4); + +\path[->,>=triangle 90] (9) edge[] node [swap] {} (3); + + +\end{tikzpicture} +\end{center} + + +\item Même question à partir de $3$, puis de $0$, puis de $8$ sur le graphe de +la figure~\ref{fig:exo}. + +\begin{figure}[h] +\begin{center} +\begin{tikzpicture}[scale = 0.8] +\node (0) at (-2,-1) {0}; + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (4) at (9,0) {4}; +\node (5) at (12,0) {5}; + +\node (6) at (0,-2) {6}; +\node (7) at (3,-2) {7}; +\node (8) at (6,-2) {8}; +\node (9) at (9,-2) {9}; +\node (10) at (12,-2) {10}; + +\node (11) at (15,0) {11}; +\node (12) at (15,-2) {12}; + +\node (13) at (0,-4) {13}; +\node (14) at (3,-4) {14}; +\node (15) at (6,-4) {15}; +\node (16) at (9,-4) {16}; +\node (17) at (12,-4) {17}; +\node (18) at (15,-4) {18}; + + + +\path[->,>=triangle 90] (0) edge[] node [swap] {} (1); +\path[->,>=triangle 90] (0) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3); + +\path[->,>=triangle 90] (1) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (1) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (2) edge[] node [swap] {} (6); + +\path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2); + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); + +\path[->,>=triangle 90] (4) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (9); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (11); +\path[->,>=triangle 90] (5) edge[] node [swap] {} (12); +\path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); + + + +\path[->,>=triangle 90] (6) edge[] node [swap] {} (14); +\path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9); + +\path[->,>=triangle 90] (7) edge[] node [swap] {} (13); +\path[->,>=triangle 90] (7) edge[] node [swap] {} (15); + + +\path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10); + +\path[->,>=triangle 90] (8) edge[] node [swap] {} (2); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (14); +\path[->,>=triangle 90] (8) edge[] node [swap] {} (15); + +\path[->,>=triangle 90] (9) edge[] node [swap] {} (3); +\path[->,>=triangle 90] (9) edge[] node [swap] {} (8); +\path[->,>=triangle 90] (9) edge[] node [swap] {} (16); + +\path[->,>=triangle 90] (10) edge[] node [swap] {} (4); +\path[->,>=triangle 90] (10) edge[] node [swap] {} (5); +\path[->,>=triangle 90] (10) edge[] node [swap] {} (17); + +\path[->,>=triangle 90] (12) edge[] node [swap] {} (10); + +\path[->,>=triangle 90] (13) edge[] node [swap] {} (0); +\path[->,>=triangle 90] (16) edge[] node [swap] {} (17); +\path[->,>=triangle 90] (17) edge[] node [swap] {} (18); +\path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16); + +\end{tikzpicture} +\end{center} +\caption{Rappel d'un graphe du chapitre 1}\label{fig:exo} +\end{figure} +\end{enumerate} +\end{exo} + + +% \begin{exo} +% Écrire en Python l'algorithme de parcours en largeur pour un graphe codé par +% liste d'adjacence. +% \end{exo} + + +% \begin{exo} +% Écrire en Python une fonction qui teste si un graphe donné par liste +% d'adjacence est un arbre dont la racine est le plus petit sommet. +% \end{exo} + +\begin{exo} +Les +{\em composantes fortement connexes} d'un graphe sont des sous-ensembles de +sommets telles que~: (1) tout sommet appartient à une composante fortement +connexe, (2) s'il existe un chemin de $p$ vers $q$ et un chemin de $q$ vers +$p$, alors $p$ et $q$ doivent appartenir à la même composante fortement +connexe~; et réciproquement. +\begin{enumerate} +\item Deux composantes fortement connexes sont-elles forcément + disjointes? Pourquoi? +\item Quels sont les composantes fortement connexes du graphe de la figure~\ref{fig:exo}. + +\item Décrire une méthode algorithmique pour trouver les composantes + fortement connexe d'un graphe. +\end{enumerate} +\end{exo} + + +% \begin{exo} +% Comment utiliser un parcours en largeur pour trouver un chemin de taille la +% plus courte possible entre deux sommets donnés? +% \end{exo} + +%%%%%%%%%%%%%%% +\subsection{Parcours en profondeur} + + +\begin{figure} +\begin{center} +\begin{tikzpicture}[scale = 0.8] + +\node (1) at (0,0) {1}; +\node (2) at (3,0) {2}; +\node (3) at (6,0) {3}; +\node (6) at (0,-2) {6}; +\node (9) at (9,-2) {9}; + +\path[->,>=triangle 90] (1) edge[] node [swap] {} (6); +\path[->,>=triangle 90] (2) edge[bend left] node [swap] {} (1); + + +\path[->,>=triangle 90] (3) edge[] node [swap] {} (2); + + + +\path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9); + +\end{tikzpicture} +\end{center} +\caption{Parcours en profondeur (1)}\label{fig:prof1} +\end{figure} + + +On ne donne pas explicitement l'algorithme de parcours en profondeur à partir +de $x$ qui +demanderait l'introduction des structures de données. On se contente d'un +pseudo-algorithme expliquant la méthode~: +\begin{enumerate} +\item $x$ est la racine de l'arbre. +\item On insère dans l'arbre le premier voisin de $x$ (sauf éventuellement + $x$). +\item On insère dans l'arbre le premier voisins du sommet + le plus récemment introduit dans l'arbre et pour lequel c'est possible. +\item On recommence l'étape précédente tant que c'est possible. +\end{enumerate} + +On va appliquer la méthode sur l'arbre de la figure~\ref{fig:graphcouvrant}, +en partant du sommet $3$. L'arbre commence par $3$ à la racine. Puis on +introduit le plus petit fils de $3$, c'est-à-dire $2$. La feuille la plus +récente de l'arbre est $2$, donc on introduit le plus petit fils de $2$, à +savoir $1$. A nouveau, on va introduire $6$, puis $9$. On obtient alors +l'arbre de la figure~\ref{fig:prof1}. + + + +\pagebreak[3] +\begin{exo} +Donner les parcours en profondeur obtenus à partir de $0$, puis $8$, puis $7$ +sur le graphe de la figure~\ref{fig:exo}. + + +% \begin{tikzpicture}[scale = 0.8] +% \node (0) at (-2,-1) {0}; + +% \node (1) at (0,0) {1}; +% \node (2) at (3,0) {2}; +% \node (3) at (6,0) {3}; +% \node (4) at (9,0) {4}; +% \node (5) at (12,0) {5}; + +% \node (6) at (0,-2) {6}; +% \node (7) at (3,-2) {7}; +% \node (8) at (6,-2) {8}; +% \node (9) at (9,-2) {9}; +% \node (10) at (12,-2) {10}; + +% \node (11) at (15,0) {11}; +% \node (12) at (15,-2) {12}; + +% \node (13) at (0,-4) {13}; +% \node (14) at (3,-4) {14}; +% \node (15) at (6,-4) {15}; +% \node (16) at (9,-4) {16}; +% \node (17) at (12,-4) {17}; +% \node (18) at (15,-4) {18}; + + + +% \path[->,>=triangle 90] (0) edge[] node [swap] {} (1); +% \path[->,>=triangle 90] (0) edge[] node [swap] {} (2); +% \path[->,>=triangle 90] (0) edge[out=60, in =120] node [swap] {} (3); + +% \path[->,>=triangle 90] (1) edge[] node [swap] {} (2); +% \path[->,>=triangle 90] (1) edge[] node [swap] {} (6); +% \path[->,>=triangle 90] (1) edge[] node [swap] {} (7); +% \path[->,>=triangle 90] (2) edge[] node [swap] {} (7); +% \path[->,>=triangle 90] (2) edge[] node [swap] {} (6); + +% \path[->,>=triangle 90] (2) edge[loop] node [swap] {} (2); + +% \path[->,>=triangle 90] (3) edge[] node [swap] {} (7); +% \path[->,>=triangle 90] (3) edge[] node [swap] {} (4); +% \path[->,>=triangle 90] (3) edge[] node [swap] {} (2); + +% \path[->,>=triangle 90] (4) edge[] node [swap] {} (9); +% \path[->,>=triangle 90] (5) edge[] node [swap] {} (9); +% \path[->,>=triangle 90] (5) edge[] node [swap] {} (11); +% \path[->,>=triangle 90] (5) edge[] node [swap] {} (12); +% \path[->,>=triangle 90] (3) edge[out=45,in=135] node [swap] {} (5); + + + +% \path[->,>=triangle 90] (6) edge[] node [swap] {} (14); +% \path[->,>=triangle 90] (6) edge[out=-20, in =-160] node [swap] {} (9); + +% \path[->,>=triangle 90] (7) edge[] node [swap] {} (13); +% \path[->,>=triangle 90] (7) edge[] node [swap] {} (15); + + +% \path[->,>=triangle 90] (8) edge[out=-20, in =-160] node [swap] {} (10); + +% \path[->,>=triangle 90] (8) edge[] node [swap] {} (2); +% \path[->,>=triangle 90] (8) edge[] node [swap] {} (4); +% \path[->,>=triangle 90] (8) edge[] node [swap] {} (14); +% \path[->,>=triangle 90] (8) edge[] node [swap] {} (15); + +% \path[->,>=triangle 90] (9) edge[] node [swap] {} (3); +% \path[->,>=triangle 90] (9) edge[] node [swap] {} (8); +% \path[->,>=triangle 90] (9) edge[] node [swap] {} (16); + +% \path[->,>=triangle 90] (10) edge[] node [swap] {} (4); +% \path[->,>=triangle 90] (10) edge[] node [swap] {} (5); +% \path[->,>=triangle 90] (10) edge[] node [swap] {} (17); + +% \path[->,>=triangle 90] (12) edge[] node [swap] {} (10); + +% \path[->,>=triangle 90] (13) edge[] node [swap] {} (0); +% \path[->,>=triangle 90] (16) edge[] node [swap] {} (17); +% \path[->,>=triangle 90] (17) edge[] node [swap] {} (18); +% \path[->,>=triangle 90] (18) edge[out=-160, in =-20] node [swap] {} (16); + +% \end{tikzpicture} + +\end{exo} + + + +% \begin{exo} +% Écrire en Python l'algorithme de parcours en profondeur pour un graphe codé par +% liste d'adjacence. +% \end{exo} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ù +%\input{automates} + +\end{document} diff --git a/main13.log b/main13.log index 95ac4d9..7d9a72e 100644 --- a/main13.log +++ b/main13.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) (format=pdflatex 2013.11.13) 15 NOV 2013 08:37 +This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) (format=pdflatex 2013.11.13) 24 JAN 2014 11:19 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -1374,11 +1374,11 @@ Package rerunfilecheck Info: File `main13.out' has not changed. Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 336. ) Here is how much of TeX's memory you used: - 12395 strings out of 495002 - 167172 string characters out of 6180261 + 12398 strings out of 495002 + 167203 string characters out of 6180261 283229 words of memory out of 5000000 - 14738 multiletter control sequences out of 15000+600000 - 109186 words of font info for 111 fonts, out of 8000000 for 9000 + 14740 multiletter control sequences out of 15000+600000 + 109807 words of font info for 113 fonts, out of 8000000 for 9000 14 hyphenation exceptions out of 8191 30i,13n,32p,479b,676s stack positions out of 5000i,500n,10000p,200000b,80000s {/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc}{/usr/share/texmf/ @@ -1401,7 +1401,7 @@ texmf-dist/fonts/type1/urw/times/utmbi8a.pfb> -Output written on main13.pdf (43 pages, 369126 bytes). +Output written on main13.pdf (43 pages, 370852 bytes). PDF statistics: 1150 PDF objects out of 1200 (max. 8388607) 1073 compressed objects within 11 object streams diff --git a/main13.pdf b/main13.pdf index cfe3e89265339572c6ceeac85483aac062362718..401ddcb0232d03603eb555a49b9de395e594961b 100644 GIT binary patch delta 27528 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
bdf+FIMz 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 M5IQ