Algorithmique Partiel n o 3 (P3)

Save this PDF as:
 WORD  PNG  TXT  JPG

Dimension: px
Commencer à balayer dès la page:

Download "Algorithmique Partiel n o 3 (P3)"

Transcription

1 Partiel n o (P) Info-spé (s) déc. 0 - :0 (D.S. 0. BW) Consignes (à lire) : Vous devez répondre sur les feuilles de réponses prévues à cet effet. Aucune autre feuille ne sera ramassée (gardez vos brouillons pour vous). Répondez dans les espaces prévus, les réponses en dehors ne seront pas corrigées : utilisez des brouillons! Ne séparez pas les feuilles à moins de pouvoir les ré-agrafer pour les rendre. Aucune réponse au crayon de papier ne sera corrigée. La présentation est notée en moins, c est à dire que vous êtes noté sur 0 et que les points de présentation ( au maximum) sont retirés de cette note. Les algorithmes : Tout algorithme doit être écrit dans le langage Algo (pas de C, Caml ou autre). Tout code Algo non indenté ne sera pas corrigé. Tout ce dont vous avez besoin (, routines) est indiqué en annexe (dernière page)! Durée : h00

2 Partiel n o (P) déc. 0 - :0 Info-spé (s) Exercice (Questions en vrac... points). (a) Si dans un graphe G il existe une chaîne d extrémités x et y et une chaîne d extrémités y et z, existe-t-il, dans G, une chaîne d extrémités x et z? (b) Justifiez graphiquement votre réponse.. (a) Si dans un graphe G il existe deux chaînes d extrémités x et y, x et y appartiennent-ils à un même cycle de G? (b) Justifiez graphiquement votre réponse.. Soient C et C des composantes fortement connexes distinctes d un graphe orienté G =< S, A >, soit x, y C, soit x, y C, et supposons qu il y ait un chemin x x dans G. Démontrez qu alors il ne peut pas y avoir, aussi, de chemin y y dans G. Exercice (Graphe sans circuit..., points). Quelle est, au niveau de la classification de ses arcs, la particularité d un graphe sans circuit?. Soit G =< S, A > un graphe sans circuit, soient les tableaux os et op contenant, respectivement, les numéros d ordre suffixe et préfixe de tous les sommets du graphe G obtenus lors du parcours en profondeur de G. Démontrer que pour une paire quelconque de sommets distincts x, y S, s il existe un arc dans G de x à y, alors os[y] < os[x]. Exercice (Arbre rouge-noir points) 0 0 Figure Arbre bicolore? Remarque : Comme d habitude les nœuds rouges sont ceux avec doubles cercles.. L arbre de la figure est-il un arbre bicolore? Si ce n est pas le cas, quel(s) nœud(s) doit-on enlever de l arbre pour qu il soit bicolore?. Écrire un algorithme qui à partir d un arbre bicolore donne la taille et la hauteur de l arbre -- qu il représente.

3 Partiel n o (P) déc. 0 - :0 Info-spé (s) Exercice (Graphes bipartis points) Un graphe biparti est un graphe (un multigraphe) non orienté G =< S, A >, dans lequel S peut être partitionné en deux ensembles S et S tels que (u, v) A implique soit que u S et v S, soit que u S et v S. Aucune arête ne doit relier deux sommets d un même ensemble. 0 Figure Graphe G Figure Graphe G Figure Graphe G. Les graphes des figures, et sont-ils bipartis? Pour chaque graphe biparti, donner les deux ensembles S et S.. Écrire un algorithme qui, à l aide d un parcours profondeur, teste si un graphe est biparti. On utilisera ici l implémentation dynamique.

4 Partiel n o (P) déc. 0 - :0 Info-spé (s) Exercice (What is this?, points) algorithme procedure build_graph parametres locaux t_graph_stat G entier s, n parametres globaux t_graph_stat NG variables t_vect_entiers map, dist t_file q entier i, j debut pour i jusqu a G.ordre faire map[i] 0 dist[i] - pour j jusqu a G.ordre faire NG.adj[i,j] 0 q file_vide() enfiler(s, q) dist[s] 0 NG.ordre map[s] faire s defiler(q) pour i jusqu a G.ordre faire si G.adj[s,i] <> 0 alors si (dist[i] = -) et (dist[s] < n) alors dist[i] dist[s] + NG.ordre NG.ordre + map[i] NG.ordre enfiler(i, q) si dist[i] <> - alors NG.adj[map[s],map[i]] G.adj[s,i] NG.adj[map[i],map[s]] G.adj[i,s] tant que non est_vide(q) fin algorithme procedure build_graph 0 Figure Graphe G. On appelle cet algorithme avec build_graph(g,,, NG) (G le graphe de la figure ). (a) Remplir le vecteur dist. (b) Remplir le vecteur map. (c) Dessiner le graphe résultat (N G).. build_graph(g, s, n, N G) est appelé avec G un graphe quelconque (non vide), s un sommet de G, et n un entier naturel non nul. (a) Pendant l exécution, que représente le vecteur dist? (b) Pendant l exécution, à quoi sert le vecteur map? (c) Après l exécution, que représente le graphe NG?

5 Partiel n o (P) déc. 0 - :0 Info-spé (s) Annexes Implémentation des arbres bicolores /* déclaration du type t_element */ t_arn = t_noeud_arn t_noeud_arn = enregistrement t_element cle booleen rouge t_arn fg, fd fin enregistrement t_noeud_arn Implémentations des graphes Les graphes utilisés ici sont non valués, les coûts ont donc été enlevés de la représentation. Statique : Dynamique : constantes Max = 00 t_mat_adj = Max Max entier t_graph_stat = enregistrement booleen orient entier ordre t_mat_adj adj fin enregistrement t_graph_stat Les vecteurs : /* Max > ordre (G) */ t_vect_entiers = Max entier t_vect_booleens = Max booleen t_listsom = s_som t_listadj = s_ladj s_som = enregistrement entier som t_listadj succ t_listadj pred t_listsom suiv fin enregistrement s_som s_ladj = enregistrement t_listsom vsom entier nb t_listadj suiv fin enregistrement s_ladj t_graph_dyn = enregistrement entier ordre booleen orient t_listsom lsom fin enregistrement t_graph_dyn Routines autorisées Les opérations sur les files et les piles peuvent être utilisées à condition de préciser le type des éléments. Files Autres file_vide():t_file est_vide(t_file q):booleen enfiler(t_eltfile e, t_file q) defiler(t_file q):t_eltfile vide_file(t_file q) recherche(entier s, t_graph_dyn G) : t_listsom retourne le pointeur sur le sommet s dans G. Piles pile_vide():t_pile est_vide(t_pile p):booleen empiler(t_eltpile elt, t_pile p) depiler(t_pile p):t_eltpile sommet(t_pile p):t_eltpile