Sauter au contenu

Section 7.4 Arbre et arborescence

Pour cette section, on suppose que tous les graphes sont finis, c’est-à-dire qu’ils possèdent un nombre fini de sommets, et donc aussi un nombre fini d’arêtes.

Sous-section 7.4.1 Forêt et arbre

Définition 7.4.1.

Un graphe \(G=(S,A)\) simple est appelé une forêt s’il ne contient aucun cycle.
Si en plus le graphe \(G\) est connexe, on dira que \(G\) est un arbre. Pour expliciter qu’un graphe est un arbre, on notera souvent le graphe \(T=(S,A)\) au lieu de \(G=(S,A)\text{.}\)

Exemple 7.4.2. Une forêt et deux arbres.

\(T_1\)\(T_2\)\(F\)
On termine la sous-section 7.4.1 avec deux propositions concernant les arbres.
Tout d’abord, lorsqu’on regarde les graphes d’un arbre, on remarque que certains des sommets ont une caractéristique particulière. En effet, on peut remarquer que pour chaque exemple, il y a toujours des sommets de degré \(1\text{.}\) Ceci n’est pas une coïncidence.
Par la suite, on remarque aussi qu’il existe une relation entre le nombre d’arêtes d’un arbre et le nombre de sommets de celui-ci.
Cette proposition nous pousse donc à donner un nom aux sommets de degré \(1\text{,}\) ainsi qu’aux sommets de degré plus grand que \(1\text{.}\)

Définition 7.4.5.

Soit \(T=(S,A)\) un arbre et soit \(s\in S\) un sommet quelconque.
  • On dit que \(s\) est une feuille de l’arbre \(T\) si \(\deg(s)=1\text{.}\)
  • On dit que \(s\) est un sommet interne, ou bien une branche de l’arbre \(T\) si \(\deg(s)>1\text{.}\)

Sous-section 7.4.2 Arbre couvrant

Lorsqu’on conçoit des algorithmes concernant les graphes, il est souvent utile d’avoir une méthode afin de nous assurer de parcourir l’ensemble des sommets de façon systématique. Une méthode pour accomplir cette tâche est de parcourir les sommets de notre graphe à l’aide d’un arbre couvrant.

Définition 7.4.7.

Soit \(G=(S,A)\) un graphe simple connexe. Un arbre couvrant de \(G\) est un sous-graphe \(T=(S,A_0)\) tel que \(T\) est un arbre. Ainsi, un arbre couvrant de \(G\) est un arbre ayant les mêmes sommets que \(G\text{.}\)
Pour pouvoir démontrer la proposition 7.4.10, on a besoin d’un résultat intermédiaire. Puisque le résultat sert principalement à démontrer une proposition plus importante, on dira qu’il s’agit d’un lemme.

Démonstration.

Soit \(s, t\in S\text{,}\) puisque \(G\) est connexe, on sait qu’il y a une chaîne simple reliant \(s\) et \(t\text{.}\) Si cette chaîne ne passe pas par \(\{s_0, s_{n-1}\}\text{,}\) alors cette chaîne est aussi une chaîne de \(G_0\text{.}\) Si cette chaîne passe par \(s_0, s_{n-1}\text{,}\) alors on peut écrire cette chaîne de la façon suivante.
On a \(s= t_0, t_1, \dots, t_{i-1}, t_{i}, t_{i+1}, t_{i+2}, \dots, t_{m}=t \text{,}\) avec \(t_{i}=s_0\) et \(t_{i+1}=s_{n-1}\text{.}\) Mais alors on sait qu’il y a une chaîne de \(G_0\) entre \(t_0=s\) et \(t_{i}\text{,}\) qu’il y a une chaîne de \(G_0\) entre \(t_i=s_0\) et \(t_{i+1}=s_{n-1}\) et qu’il y a une chaîne de \(G_0\) entre \(t_{i+1}\) et \(t_{m}=t\text{.}\) Ainsi, par l’exercice 7.3.5.2, il y a une chaîne entre \(s\) et \(t\) dans \(G_0\text{.}\)
On a montré qu’il existe une chaîne de \(G_0\) entre chaque paire de sommets, c’est-à-dire que \(G_0\) est connexe.

Exemple 7.4.9.

On montre un cas particulier du lemme précédent pour bien visualiser. Soit \(G\) le graphe ci-dessous, et \(G_1\) le graphe obtenu de \(G\) en enlevant l’arête \(\{1, 2\}\) de \(G\text{.}\) On remarque que la chaîne \(0, 1, 2, 3\) est une chaîne de \(G\) reliant \(0\) avec \(3\text{.}\) Puisque \(G_1\) ne possède pas l’arête \(\{1,2\}\text{,}\) cette chaîne n’est pas une chaîne de \(G_1\text{.}\) Cependant, puisque \(\{1,2\}\) fait parti d’un cycle dans \(G\text{,}\) on remarque que la chaîne \(0,1,4,5,6,7,2,3\) et une chaîne de \(G_1\) reliant \(0\) et \(3\text{.}\)

Démonstration.

On construit une suite \(G_k=(S,A_k)\) de sous-graphe de \(G\) par récurrence, c’est-à-dire qu’on définit \(G_0\text{,}\) et ensuite, ayant défini \(G_k=(S,A_k)\) pour \(k\geq 0\text{,}\) on définit \(G_{k+1}\text{.}\) On va continuer le processus jusqu’à ce que le graphe obtenu soit un arbre. Ce processus se terminera nécessairement en un nombre fini d’étape, disons \(n\) étapes. À la fin, on posera \(T=G_n\text{.}\)
On pose \(G_0=G\text{.}\) Ensuite, on suppose qu’on a défini \(G_k=(S,A_k)\) un graphe simple connexe pour \(k\geq 0\text{.}\) Si \(G_k\) est un arbre, alors il s’agit d’un arbre couvrant pour \(G\text{,}\) et on a terminé. Si au contraire \(G_k\) n’est pas un arbre, on doit définir \(G_{k+1}\) un graphe simple connexe contenant une arête de moins que \(G_k\text{.}\)
Puisque \(G_k\) n’est pas un arbre, \(G_k\) possède un cycle, disons le cycle \(s_0, s_1, \dots, s_{m-1}, s_m\text{,}\) avec \(s_{m}=s_0\text{.}\) On pose alors \(G_{k+1}=(S,A_{k+1}):= G_k-\{s_{m-1}, s_m\}=(S,A_k-\{s_{m-1},s_m\})\text{.}\) Le graphe obtenu est donc un graphe avec les mêmes sommets que \(G\text{,}\) possédant une arête de moins que le graphe \(G_k\text{.}\) On doit vérifier qu’il s’agit toujours de graphe connexe. Or, par le lemme 7.4.8, on sait que \(G_{k+1}\) est connexe.
Puisqu’on enlève une arête à chaque étape, et que le nombre d’arêtes de \(G\) est fini, on doit nécessairement arriver à un point où \(G_k\) ne possède pas de cycle. Si le processus se termine avec \(k=n\text{,}\) alors on pose \(T=G_n\text{.}\) Puisque \(T\) possède les mêmes sommets que \(G\text{,}\) est connexe et ne possède aucun cycle. \(T\) est donc bien un arbre couvrant de \(G\text{.}\)

Sous-section 7.4.3 Arborescence

Un exemple classique d’utilisation des arbres est les arbres généalogiques. Une façon de représenter un arbre généalogique est de commencer par un ancêtre commun de la famille, qu’on représente par un sommet, et de relier ce sommet par une arête à un sommet représentant chacun des enfants de cette personne. Par la suite, on ajoute un sommet pour chaque enfant de la génération suivante, reliant les enfants à leur parent.
On veut utiliser cette idée afin de représenter les arbres, c’est-à-dire qu’on choisira un sommet pour être l’ancêtre de tous les autres sommets. Ceci permettra de donner un certain ordre à nos arbres. Pour chaque sommet, on pourra considérer l’unique chaîne simple le reliant à l’ancêtre commun. La longueur de cette chaîne représentera en quelque sorte la génération à laquelle chaque sommet appartient.
Cette représentation est très utile lorsqu’on veut représenter un arbre de décision, c’est-à-dire un arbre permettant de répondre à un problème particulier. En effet, cette représentation nous permettra de donner une longueur minimale associée à notre arbre de décision. Ceci servira à vérifier si l’algorithme utilisé peut être optimisé, ou bien s’il s’agit déjà de l’algorithme le plus efficace.
La combinaison d’un arbre et de notre ancêtre commun est ce qu’on appelle une arborescence. Ainsi, une arborescence n’est rien d’autre qu’un arbre pour lequel on a choisi un sommet particulier.

Définition 7.4.11.

Une arborescence est une paire \((T,r)\)\(T=(S,A)\) est un arbre et \(r\in S\) est un sommet de \(T\text{.}\) On appellera \(r\) la racine de \(T\text{.}\)
Si \((T,r)\) est une arborescence, puisque \(T\) est un arbre, pour tout sommet \(s\) de \(T\text{,}\) il existe une unique chaîne simple entre \(r\) et \(s\text{.}\) Ceci nous permet de donner les définitions suivantes.

Définition 7.4.12.

Soit \((T,r)\) une arborescence et soit \(s\) un sommet de \(T\text{.}\) On note l’unique chaîne entre de \(T\) entre \(s\) par \(r=s_0, s_1, \dots , s_{n}=s\)
  • Le niveau du sommet \(s\) est la longueur de la chaîne \(s_0, \dots s_n\text{,}\) c’est-à-dire \(n\text{.}\)
  • Le plus grand niveau de l’arborescence \(T\) est appelé la hauteur de \(T\text{.}\)
  • Les sommets \(s_0, s_1, \dots, s_{n-1}\) sont appelés les ancêtres de \(s\text{.}\) À l’inverse, on dira que \(s\) est un descendant des sommets \(s_0, s_1, \dots, s_{n-1}\text{.}\)
  • Le sommet \(s_{n-1}\) est appelé le parent de \(s\text{,}\) alors qu’on dira que \(s\) est l’enfant de \(s_{n-1}\)

Questions de compréhension de la lecture 7.4.4 Questions de compréhension de la lecture

Ces questions sont à faire avant de venir en classe et à remettre au début du cours.

1.

Noter toute question qui demeure suite à la lecture de la section et la résolution des exercices ci-dessus ou toute précision/clarification à apporter. Note: cette question est facultative.