Lycée Carnot — 2016-2017 Option informatique MP/MP*
À quel endroit faut-il incrémenter la référence id pour que le parcours permette de calculer les compo-
santes connexes ?
QUESTION 8 Écrire une fonction is_connected :graph -> bool qui vérifie si un graphe est connexe.
QUESTION 9 Écrire une fonction connected_components :graph -> graph list qui renvoie les
sous-graphes correspondant aux composantes connexes.
5 Graphes orientés acycliques et tri topologique
Définition 1. Un ordre topologique d’un graphe orienté G = (S,A)est un ordre total 2sur les sommets tel que
si (s,s0)∈A alors s ≺s0, c’est-à-dire compatible avec la relation d’ordre partielle donnée par les arcs.
QUESTION 10 Montrer qu’un graphe orienté qui admet un ordre topologique est acyclique.
QUESTION 11 Montrer que dans un graphe orienté acyclique G= (S,A), si (s,s0)∈Aalors post[s]>
post[s0].
QUESTION 12 En déduire un algorithme qui détecte si un graphe est acyclique et l’implémenter.
QUESTION 13 À l’aide des temps de dernier passage, trouver un algorithme qui, pour un graphe acyclique,
trie les sommets de ce graphe selon un ordre topologique et l’implémenter.
Remarque 1. Il y a donc équivalence, pour un graphe orienté, entre être acyclique et admettre un ordre topologique.
6 Composantes fortement connexes d’un graphe orienté
Soit G= (S,A)un graphe orienté.
QUESTION 14 Pourquoi ne peut-on pas simplement effectuer un parcours de graphe pour trouver les
composantes (fortement) connexes, comme dans le cas non-orienté ?
On définit le méta-graphe de Gcomme étant le graphe MG= (Cf,Af)où Cfest l’ensemble des com-
posantes fortement connexes de Get Af={(c1,c2)∈C2
f,∃s1∈c1,∃s2∈c2,(s1,s2)∈A}.
QUESTION 15 Montrer que MGest un graphe orienté acyclique. À quelle condition a-t-on G=MG?
QUESTION 16 Soit c∈Cftel que d+(c) = 0, on dit que cest un puits. Soit s∈c. Pourquoi la fonction
explorer au départ de sdans Gpermet de trouver exactement c? Ceci suggère un algorithme pour
trouver les composantes fortement connexes : (1) choisir un sommet sappartenant à un puits de MG;
(2) utiliser le parcours en profondeur à partir de sommet pour construire sa composante connexe ; (3)
supprimer cette composante du graphe initial ; (4) recommencer avec les sommets restants.
Le problème, c’est que l’on ne voit pas bien a priori comment trouver un sommet appartenant à un
puits de MG. En revanche, il est plus simple de trouver un sommet appartenant à une source de MG. Un
sommet cest une source si d−(c) = 0.
QUESTION 17 Soient c1,c2∈Cf, montrer que si (c1,c2)∈Afalors
max
s1∈c1
post[s1]>max
s2∈c2
post[s2]
En déduire un algorithme permettant de trouver un sommet sappartenant à une source de Mf.
QUESTION 18 Pour trouver un puits de MG, on peut utiliser le graphe transposé de G(cf. EXERCICE 15 du
TP no2). Pourquoi les composantes fortement connexes de GRsont les mêmes que celles de G? Que vaut
Mf(GR)? En déduire un algorithme pour trouver un sommet sappartenant à un puits de Mf(G).
QUESTION 19 En déduire un algorithme pour trouver les composantes fortement connexes d’un graphe
oriente et l’implémenter en CAML. Montrer que sa complexité est toujours linéaire (i.e. O(|S|+|A|)).
http://carnot.cpge.info 3