MP option informatique Exercice 12 (Algorithme de Kruskal) Graphes
1) a) Le graphe G´etant connexe, on peut consid´erer l’ensemble de ses sous-graphes connexes qui ne
sera pas vide (mais est fini). On consid`ere dans cet ensemble un sous-graphe qui a le moins
d’arˆetes. Il est n´ecessairement acyclique car s’il avait un cycle, on pourrait enlever une arˆete sans
” casser ” la connexit´e.
b) A tout moment le sous-graphe (V, Ek) est acyclique par d´efinition.
Montrons que le graphe final (not´e Gf= (V, Ef)) est connexe. Par l’absurde, supposons qu’il ne
le soit pas. On consid`ere alors deux composantes connexes de Gf. Elles sont reli´es par un chemin
(dans G). Soit eune arˆete de Gqui ” sort ” d’une composante connexe (il suffit de prendre la
premi`ere arˆete du chemin consid´er´e ci-dessus). De ce fait, ajouter e`a Gfne va pas cr´eer un cycle
- cela signifie qu’au moment o`u on a consid´er´e e(pour ne pas l’ajouter) elle ne cr´eait pas de cycle.
C’est donc absurde.
Finalement Gfest bien un arbre.
2) L’ensemble des arbres couvrant est un sous-ensemble de l’ensemble des sous-graphes. Il est donc fini.
Il y a donc des arbres couvrants de poids minimal.
3) a) -
b) Consid´erons C1, . . . , Cples composantes connexes de (V, E1).
S’il existe une arˆete de E2qui connecte deux composantes connexes distinctes alors on peut
ajouter cette arˆete sans cr´eer un cycle.
Supposons `a l’inverse que toute arˆete de E2connecte deux sommets d’une mˆeme composante
connexe. Comme |E2|>|E1|il existe une des composantes connexe o`u il y a (strictement)
plus d’arˆetes de E2que de E1. En se restreignant `a cette composante connexe, on voit que
E1engendre un arbre (connexe et sans cycle). Il ne se peut donc pas que E2ait plus d’arˆetes.
On ne peut finalement pas ˆetre dans ce cas.
c) Montrons par r´ecurrence sur kque pour tout arbre couvrant Tde poids minimal, la somme des
poids des karˆetes les plus l´eg`eres de Test sup´erieure ou ´egale `a la somme des karˆetes de l’arbre
renvoy´e par l’algorithme.
Fixons les notations. On pose (e1, . . . , em) les arˆetes du graphes (class´ees par poids croissant).
On note i1i2≤ · · · ≤ in1les indices des arˆetes dans Tet j1≤ · · · ≤ jn1les arˆetes du graphe
renvoy´e par l’algorithme.
Initialisation : Pour k= 0 c’est vrai
H´er´edit´e : on suppose que la propri´et´e est vraie pour un kdonn´e. C’est-`a-dire que
p(ej1) + · · · +p(ejk)p(ei1) + · · · +p(eik)
D’apr`es la question pr´ec´edente, on sait qu’il existe une arˆete eαdans {ei1, . . . , eik+1 } \
{ej1, . . . , ejk}telle que si on l’ajoute `a {ej1, . . . , ejk}on obtient un graphe sans cycle. Comme
elle n’a de fait pas ´et´e ajout´ee alors
p(ejk)p(eα)
De ce fait, p(ejk+1 )p(eα). On a donc
p(ej1) + · · · +p(ejk+1 )p(ei1) + · · · +p(eik) + p(eα)p(ei1) + · · · +p(eik+1 )
car p(eα)p(eik+1 ).
Lyc´ee Chateaubriand 1/3
MP option informatique Exercice 12 (Algorithme de Kruskal) Graphes
d) On impl´emente l’algorithme de Kruskal. Il faut d’abord construire la liste des arˆetes tri´ees selon
leur poids. On construit cette liste par :
let creeListeArete g =
let n = vect_length g in
let rec ajoute l i =
matc h i , l with
| i, [] when i = n -> []
| i, [] -> ajoute g .(i + 1) (i + 1)
| i ,( j ,p ) :: q -> (p , i , j) :: a jo ute q i
in
ajou te g .(0) 0;;
qui permet de cr´eer une liste des arˆetes sous la forme de triplets : poids, debut, fin.
On peut alors faire (par exemple) un tri fusion
let rec divis ion liste =
match liste with
|[]->[],[]
|a ::[] - > liste ,[]
| a :: b :: c ->
let (l1 , l2 ) = d ivis ion c in
a :: l1 , b :: l2 ;;
let rec fusionT ri liste1 liste2 =
match liste1 , liste2 with
|[] , _ - > lis te2 ;
|_ ,[] - > liste 1 ;
|( p1 , i1 , j1 ) :: q1 , ( p2 , i2 , j2 ) :: q2 - >
if p1 < p2 then
(p1 ,i1 , j1 )::( fu sionTri q1 liste2 )
else
( p2 , i2 , j2 ) ::( fu sio nTri li st e1 q2 ) ;;
let rec tr i_fusion liste =
match liste with
|[] - >[];
|a ::[] - > liste ;
|_ ->
begin
let ( liste1 , li ste2 ) = di visio n l iste in
fus io nTri ( tri_fusi on ( liste1 )) ( t ri_fusion ( liste2 )) ;
end ;;
Lyc´ee Chateaubriand 2/3
MP option informatique Exercice 12 (Algorithme de Kruskal) Graphes
Il ne reste plus qu’`a ´ecrire le programme en utilisant la structure Union-Find.
let kruskal g =
let listeArete = t ri _fusion ( cr ee ListeAr et e g ) in
let n = vect_length g in
let t = creer2 n in
let rec trai te Li st e l = match l with
| [] -> []
| (p , i , j ) :: q -> if r ep re se ntant2 t i = r ep re se ntant2 t j
then traiteListe q
else ( fusion2 t i j;
(p , i , j ) :: t ra ite Lis te q )
in
traiteListe listeArete;;
Lyc´ee Chateaubriand 3/3
1 / 3 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans l'interface ou les textes ? Ou savez-vous comment améliorer l'interface utilisateur de StudyLib ? N'hésitez pas à envoyer vos suggestions. C'est très important pour nous!