ROB3 – Algorithmique – Interrogation n 3

publicité
ROB3 – Algorithmique
année 2014–2015
ROB3 – Algorithmique – Interrogation n◦3
Durée : 2 heures – barême indicatif
Exercice 1 (4 pts)
Q 1.1 Donner les états de la structure de données union-find (sous forme de forêts) à chaque étape de la
séquence suivante d’opérations, en partant des singletons {0}, {1}, {2}, . . . , {9}. On utilisera l’union pondérée
et la compression de chemins. En cas d’égalité, on prendra le plus petit indice comme racine.
union(3,4), union(4,9), union(8,0), union(2,3), union(5,6), union(5,9), union(7,3), union(4,8), union(6,1).
2/20
ROB3 – Algorithmique
page 2
Q 1.2 Tracer l’arbre couvrant minimum T obtenu en exécutant l’algorithme de Kruskal sur le graphe ci-dessous.
Pour chaque arête de T , indiquer un cocycle qui justifie l’insertion de l’arête dans T . Par exemple, le cocycle
défini par la partition ({C}, {A, B, D, E, F, G}) justifie l’insertion de l’arête {C, D}.
2/20
ROB3 – Algorithmique
page 3
Exercice 2 (5 pts)
Q 2.1 Dérouler l’algorithme de Dijkstra pour déterminer l’arborescence des plus courts chemins depuis le
sommet 1 dans le graphe G = (V, E, c) orienté ci-dessous (on représentera l’arborescence partielle des plus
courts chemins à chaque étape de l’algorithme). En cas d’égalité, on examinera en priorité le sommet de plus
petit indice.
2/20
ROB3 – Algorithmique
page 4
Q 2.2 On définit un nouveau graphe G0 = (V ∪ V 0 , E10 ∪ E20 , c0 ) à partir de G, où :
— V 0 comporte un sommet xe pour chaque arc e = (x, y) de E pour lequel c(e) = 2,
— E10 = {e ∈ E : c(e) = 1},
— E20 comporte deux arcs (x, xe ) et (xe , y) pour chaque arc e = (x, y) de E pour lequel c(e) = 2,
— c0 est une fonction de coût unitaire (qui associe un coût de 1 à chaque arc de E10 ∪ E20 ).
Représenter G0 ainsi que l’arborescence couvrante associée à un parcours en largeur de G0 depuis le sommet 1
(qui visite en priorité le sommet de plus petit indice). A quoi correspond cette arborescence si on la réinterprète
dans G ? (on ne demande pas ici de justification)
1.5/20
Q 2.3 On suppose ici que le graphe est représenté sous forme de listes d’adjacence. Pour un graphe G avec des
coûts 1 et 2, quelle est la complexité de l’algorithme consistant à construire un nouveau graphe G0 à partir de G
puis à réaliser un parcours en largeur de G0 ? Rappeler la complexité de l’algorithme de Dijkstra. Conclusion ?
1.5/20
ROB3 – Algorithmique
page 5
Exercice 3 (7 pts)
Q 3.1 Est-il possible de dessiner un graphe non-orienté à 7 sommets dont tous les sommets sont de degré 3 ? Si
oui, le dessiner, sinon prouver que ce n’est pas possible.
1/20
On s’intéresse dans les questions qui suivent à établir une condition nécessaire pour qu’un graphe connexe
soit planaire. Un graphe est planaire si il est possible de le dessiner sur un plan sans croisement d’arêtes. Par
exemple, le graphe sur la figure de gauche ci-dessous est planaire car on peut le représenter sans intersection
comme montré sur la figure de droite.
Soit G un graphe planaire. Une face F de G est une région maximale du plan délimité par un ensemble d’arêtes
de G, et qui n’en contient aucune. Le degré de F , noté d(F ), est le nombre de bords d’arêtes (chaque arête a
deux bords et deux extrêmités) de G qui bordent F . Par exemple, dans la représentation planaire du graphe
précédent, nous avons exactement 4 faces, numérotées de 1 à 4 (la face 4 est la face extérieure). Toutes sont ici
bordées par 3 bords d’arêtes du graphe exactement, c’est-à-dire qu’elles sont toutes de degré 3.
On notera n le nombre de sommets, m le nombre d’arêtes et f le nombre de faces dans un graphe G.
Q 3.2 Dans un graphe planaire quelconque, exprimer
réponse.
P
F
d(F ) en fonction de m en justifiant brièvement la
1/20
ROB3 – Algorithmique
page 6
La formule d’Euler indique que pour tout graphe planaire connexe on a n − m + f = K, où K une constante.
L’objet des questions qui suivent est de déterminer cette constante K, et de prouver la formule.
Q 3.3 Clairement, tout arbre est planaire. Soit G un arbre. Quelle est la valeur de n − m + f pour G, autrement
dit de K ?
1/20
Q 3.4 Soit G un graphe planaire connexe comportant au moins un cycle, et G0 le graphe obtenu en supprimant
une arête quelconque dans un cycle de G. On note n0 , m0 , f 0 le nombre de sommets, arêtes, faces dans G0 .
Exprimer n0 en fonction de n, m0 en fonction de m, et f 0 en fonction de f (on ne demande pas ici de justification).
En déduire la relation entre n − m + f et n0 − m0 + f 0 .
1/20
Q 3.5 A l’aide des deux questions précédentes, prouver la formule d’Euler en spécifiant la valeur de K.
1/20
ROB3 – Algorithmique
page 7
Q 3.6 Pour un graphe planaire simple (pour tout couple de sommets, il y a au plus une arête entre eux)
et connexe avec n ≥ 3, donner une borne inférieure de d(F ) pour toute face F (on ne demande pas ici de
justification précise). A l’aide du résultat de la question 2, en déduire que 2m ≥ 3f . A l’aide de la formule
d’Euler, en déduire une inégalité portant sur n et m pour un graphe planaire simple et connexe.
1/20
Q 3.7 Le graphe
admet-il une représentation planaire ? Justifier la réponse.
1/20
Exercice 4 (4 pts)
Le codage de Prüfer est une méthode pour décrire de façon très compacte un arbre dont les sommets sont
numérotés. Ce codage permet de représenter un arbre numéroté de n sommets avec une suite P = (x1 , x2 , x3 , ..., xn−2 )
de n − 2 termes. Une suite P donnée correspond à un et un seul arbre numéroté de 1 à n. L’algorithme pour
générer le code de Prüfer P (sous forme d’un tableau P indicé de 0 à n − 3) d’un arbre T est le suivant :
pour i = 1 à n faire
d[i] = nombre de voisins de i dans T
F = {i ∈ {1, . . . , n} : d[i] = 1}
/* Feuilles de T */
pour k = 0 à n − 3 faire
j = min{i : i ∈ F }
i = unique voisin de j dans T
supprimer j de F
d[i] = d[i] − 1
si d[i] = 1 alors
insérer i dans F
P [k] = i
retourner P
Par exemple, pour l’arbre numéroté ci-dessous, le code de Prüfer est 744171.
ROB3 – Algorithmique
page 8
Q 4.1 Quel code de Prüfer est obtenu pour l’arbre ci-dessous ?
1/20
Q 4.2 Dans l’algorithme précédent pour générer le code de Prüfer, quelles structures de données recommander
d’une part pour représenter le graphe, d’autre part pour stocker l’ensemble (dynamique) F ? Quelle est alors la
complexité de l’algorithme ?
2/20
Q 4.3 L’algorithme associe à tout arbre un unique code de Prüfer. Inversement, à partir de n’importe quel code
de Prüfer il est possible de calculer l’unique arbre correspondant. En déduire le nombre d’arbres couvrants d’un
graphe complet à n sommets (en justifiant brièvement la réponse).
1/20
Téléchargement