Vous êtes sur la page 1sur 6

Contrôle du 12 décembre 2007 Élèves de première année

Structures discrètes et algorithmes


Durée : 1 h 30
Tout document autorisé. Ordinateurs interdits ; calculatrices autorisées.
L’épreuve est constituée de quatre exercices indépendants.
Le barème n’est donné qu’à titre indicatif et pourra être modifié.

Exercice 1 (3 points)
On considère un arbre binaire de recherche contenant des entiers tous distincts dont
l’entier 32. On s’intéresse à la liste des valeurs des nœuds se trouvant dans l’arbre entre la
racine et le nœud contenant 32. Parmi les séquences suivantes, indiquer pour chaque séquence
si elle peut ou non être une telle liste. Justifier la réponse.

a) 25 70 38 27 32
b) 2 90 53 14 56 45 32
c) 85 7 25 72 33 29 32

Corrigé : soit L une liste de données successives L(1), L(2), …, L(p). Supposons que L
corresponde à une liste de données de nœuds rencontrés dans la recherche. Alors, si, pour
1 ≤ i ≤ p – 1, on a L(i) > L(i + 1), toutes les données suivantes de la liste sont inférieures ou
égales à L(i) ; en effet, elles appartiennent au sous-arbre gauche (resp. droit) du nœud dans
lequel a été lu L(i).
La liste b) ne peut donc pas être la séquence de nœuds parcourus ; en effet, puisque
53 > 14, toutes les données qui suivent doivent être inférieures à 53 et ce n’est pas le cas de
56.
Les deux ABR ci-dessous montrent que les listes a) et c) conviennent.
25 85

70 7

38 25
72

27
33

32 29

32

Fin de corrigé
2

Exercice 2 (5 points)
On construit un graphe orienté d’ordre n dont les sommets ont tous un degré extérieur
(appelé aussi degré sortant ou demi-degré extérieur) au moins égal à 1. Les sommets sont
identifiés par les numéros 1, 2, …, n.
1 – Montrer que G contient au moins un circuit.
2 – On suppose que le graphe est déjà codé. Décrire le principe d’un algorithme qui permette
d’exhiber un circuit de G ; on déterminera la complexité de l’algorithme dans les cas
suivants :
a) le graphe est codé par sa matrice d’adjacence ;
b) le graphe est codé par un tableau donnant, pour chaque sommet, la liste de ses
successeurs (aussi appelés voisins extérieurs, ou fils) ;
ATTENTION : dans chacun des cas, on cherchera à obtenir la meilleure complexité possible.

Corrigé
Considérons un chemin élémentaire C = x1 x2… xp de longueur maximum. Le sommet
xp a au moins un voisin ; soit y un tel voisin ; le chemin ayant une longueur maximum, le
sommet y appartient forcément C ; il s’agit d’un sommet xi ; le graphe contient le circuit
x i x i + 1 … x p x i.
Cette preuve peut aussi être faite ainsi. Soit x1 un sommet quelconque ; soit x2 un
voisin de x1 ; si x2 = x1, on a un circuit ; sinon, soit x3 un voisin de x1 ; si x3 = x1 ou x2, on a un
circuit ; ainsi de suite ; le nombre de sommets du graphe étant fini, on arrivera à un sommet xp
dont un voisin est parmi x1, x2, … , xp – 1 : il existe un circuit.

Le principe de l’algorithme proposé suit le principe de la seconde preuve ci-dessus. On


part d’un sommet x1 ; on passe au premier voisin x2 de x1 puis à un voisin x3 de x2 jusqu’à
rencontrer, à partir d’un sommet xi, un sommet xj déjà rencontré : on a alors le circuit
xj, xj + 1, … , xi. L’algorithme peut utiliser un tableau T indicé par les numéros de sommets,
initialisé avec des valeurs 0. Ce tableau indique quels sommets ont été rencontrés et, lorsque
l’on rencontre le sommet xk à partir de xk – 1, on met xk – 1 dans la case d’indice xk de T. Ce
tableau permet de savoir si on est déjà passé par un sommet donné et, si tel est le cas, on peut
reconstituer le circuit de proche en proche.
Si le graphe est codé par la matrice d’adjacence, l’algorithme a une complexité majoré
par O(n2) ; cette complexité peut être atteinte ; ce sera le cas si le graphe est constitué
uniquement d’un circuit 1, n, n – 1, n – 2,…, 2, 1 ; il faudra parcourir la ligne entière du
sommet 1, n – 1 cases pour le sommet n, …, 2 cases pour le sommet 2, 1 case pour le sommet
1, ce qui donne la somme des n premiers entiers dont l’ordre de grandeur est n2.
Si le graphe est codé par les listes des fils, chaque fils est trouvé en O(1) ; par ailleurs,
l’initialisation du tableau décrivant les sommets déjà rencontrés est en O(n) et donc
l’algorithme est aussi en O(n).
Fin de corrigé

Exercice 3 (7 points)
1 – On cherche dans le graphe orienté G ci-dessous le nombre maximum de chemins deux à
deux arc-disjoints (deux chemins sont dits arc-disjoints s’ils n’ont aucun arc en commun) de a
à f. On propose les trois chemins suivants : (a, f), (a, b, f), (a, i, c, d, f). En appliquant un
algorithme du cours qu’on précisera, et en initialisant obligatoirement cet algorithme en
utilisant les chemins proposés, déterminer un ensemble de chemins deux à deux arc-disjoints
de a à f de cardinal maximum. Déduire un ensemble minimum d’arcs dont la suppression
détruit tout chemin de a à f. On pourra utiliser la feuille jointe.
3

a
b
i

c
h

f e

2 – On considère les deux ensembles disjoints de sommets A = {a, b, c} et B = {f, g}. On


cherche dans G le nombre maximum de chemins deux à deux arc-disjoints dont l’origine soit
dans A et l’extrémité dans B. Décrire et justifier une méthode pour résoudre ce problème. On
ne demande pas d’appliquer cette méthode ni de déterminer explicitement le nombre
maximum de chemins.

Corrigé
1 – Comme il a été vu en cours, le problème revient à un problème de flot de valeur maximum
dans le réseau qui utilise le graphe G, dont la source est le sommet a, le puits le sommet f,
tous les arcs ayant une capacité de 1. La valeur maximum du flot est alors égal au nombre
maximum de chemins arc-disjoints de a à f et on retrouve ces chemins en considérant les arcs
portant un flux de 1. On initialise les flux en utilisant les chemins indiqués ; cette initialisation
est indiquée ci-dessous, tous les entiers représentent des flux, les flux non indiqués sont nuls.
Les capacités, toutes de 1, ne sont pas indiquées. On cherche une chaîne augmentante par
l’algorithme de marquage. Les sommets marqués sont en gras, les marques sont indiquées à
côté des sommets marqués ; la quantité dont on peut augmenter vaut toujours 1.
4

a 1
1
(g, +) i b (h, +)

1 (d, – )
(a, +) c
h

1
1

1
d
1 (i, +)
g
(h, +)

(c, +) f e (a, +)

On a mis en évidence la chaîne ahgidcf ; en utilisant cette chaîne augmentante, on


obtient le flot ci-dessous :
a 1
1 (h, +)
b
i

1
1
(e, +) c
h 1

1
1
1

1
d
1 1
g

f e (a, +)
5

On obtient un flot de valeur 4. La coupe (M, M ) avec M = {a, b, e, h} est aussi de


capacité 4 : le flot actuel est de valeur maximum.
On obtient quatre chemins arc-disjoints en suivant les arcs de flux de 1 ; on obtient les
chaînes : abf, af, aidf, ahgicf.
La suppression des quatre arcs de la coupe (M, M ), c’est-à-dire les arcs (a, i), (h, g),
(a, f) et (a, f)

2 – On propose la méthode suivante. On ajoute deux sommets nommés s et p. Le sommet s


est joint par un arc aux sommets a, b et c ; les sommets f et g sont joints par un arc au sommet
p. L’arc (s, a), est de capacité égal au degré extérieur de a, c’est-à-dire 4 ; de même, l’arc
(s, b) est de capacité1 et l’arc (s, c) est de capacité 2. L’arc (f, p) est de capacité égal à son
degré intérieur, c’est-à-dire 4, de même l’arc (g, p) est de capacité 2. À toute collection de
chemins arc-disjoints de {a, b, c} à {f, g}, on peut associer un flot à flux entiers dans le réseau
ainsi construit ; pour cela, on met un flux de 1 sur tous les arcs des chemins et on complète les
flux pour qu’il y ait conservation aux dans les sommets a, b, c, f, g, ce qui est toujours
possible à cause du choix des capacités. On définit ainsi par construction une bijection de
l’ensemble des collections de chemins arc-disjoints de {a, b, c} à {f, g} sur l’ensemble des
flots à flux entiers dans le réseau, et le nombre de chemins de la collection est égal à la valeur
du flot correspondant. En conséquence, chercher un maximum de chemins arc-disjoints de
{a, b, c} à {f, g} revient à chercher un flot à flux entiers à valeur maximum dans le réseau, ce
qui peut être fait avec l’algorithme de Ford et Fulkerson. On trouve alors les chemins en
suivant les arcs de flux 1 de {a, b, c} à {f, g}.
Fin de corrigé

Exercice 4 (5 points)

On appelle CHAM le problème suivant :


Donnée : un graphe G non orienté connexe et deux sommets distincts α et β de G.
Question : G admet-il une chaîne hamiltonienne (chaîne passant une fois et une seule par
chaque sommet) d’extrémités α et β ?
On admet que CHAM est NP-complet.

On considère le problème suivant appelé HAM.


Donnée : un graphe H non orienté connexe.
Question : H admet-il un cycle hamiltonien (cycle passant une fois et une seule par chaque
sommet) ?

Montrer à l’aide de CHAM que HAM est NP-complet. On détaillera la démonstration.

Corrigé
Il faut d’abord montrer que HAM est dans la classe NP.
Considérons une instance de HAM pour laquelle la réponse est oui. Nous notons n
l’ordre de H. Supposons que l’on sache exhiber un cycle hamiltonien C : x1, x2, x3, … xn.
L’algorithme suivant permet de vérifier que ce cycle est bien hamiltonien : pour i qui varie de
1 à n – 1, on vérifie que les arêtes {xi, xi+1} appartiennent au graphe H ; on vérifie aussi que
l’arête {xn, x1} appartient au graphe H ; cela montre qu’il s’agit bien d’un cycle ; cette
vérification se fait en O(n). On constitue ensuite un tableau tab indicé par les sommets et
initialisé à 0 ; on parcourt la suite des sommets du cycle C ; pour chaque sommet z de ce
6

cycle, on incrémente de 1 la valeur contenue dans la case correspondant à z du tableau tab ; on


vérifie après avoir considéré tous les sommets de C que toutes les valeurs du tableau tab sont
égales à 1 ; cela montre que la chaîne passe bien une fois et une seule par chaque sommet du
graphe cette vérification se fait en O(n). Comme on peut admettre que la taille T du codage du
graphe G est de l’ordre de n2 si G est codé par sa matrice d’adjacence, la complexité de cette
vérification est en O( T ) et donc polynomiale en la taille du codage de l’instance.
Montrons maintenant que CHAM se réduit polynomialement à HAM. Considérons
une instance I = (G, α, β) de CHAM défini par un graphe G et la donnée de deux sommets α
et β de G ; on construit à partir de G un graphe H en ajoutant un sommet z ainsi que les arêtes
{z, α} et {z, β}. On considère l’instance J de HAM défini par H.
Montrons que G admet une chaîne hamiltonienne d’extrémités α et β si et seulement
si H admet un cycle hamiltonien. Supposons que G admette une chaîne hamiltonienne
d’extrémités α et β, on peut alors dans H ajouter à cette chaîne la chaîne β, z, α : on forme
ainsi un cycle hamiltonien de H. Supposons maintenant que H admette un cycle
hamiltonien Cy ; ce cycle passant par z, il contient nécessairement la chaîne β, z, α ; on
considère la chaîne de H obtenu à partir de Cy en retirant la chaîne β, z, α ; cette chaîne est
aussi une chaîne de G et cette chaîne a pour extrémités α et β. La réponse est donc « oui »
pour I avec CHAM si et seulement la réponse est « oui » pour J avec CHAM. La
transformation de I en J a une complexité de O(n2), la taille de l’instance I est de l’ordre n2, la
transformation est donc en O(T) ; elle est polynomiale en la taille T.
On a ainsi montrer que HAM est NP-complet.
Fin de corrigé