Probleme – Regrouper par arbre couvrant
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 23 — Unir & trouver, arbres couvrants
Énoncé
On veut répartir points en groupes de manière que les groupes soient le plus séparés possible. On appelle espacement d'une répartition la plus petite distance entre deux points de groupes différents, et l'on cherche à le maximiser.
- Montrer que retirer les arêtes les plus lourdes d'un arbre couvrant minimal donne une répartition optimale.
- Écrire l'algorithme. Quel est son lien avec Kruskal ?
- Vérifier sur un exemple.
Corrigé
1. La preuve, en deux temps. Soit un arbre couvrant minimal du graphe complet des distances, et soit la répartition obtenue en retirant de ses arêtes les plus lourdes — elle a bien groupes, puisque retirer une arête d'un arbre le coupe en deux. Notons le poids de la plus légère des arêtes retirées.
Premier temps : l'espacement de vaut exactement . Il est , puisque l'arête retirée de poids joint deux points de groupes différents. Pour l'autre sens, on raisonne sur l'exécution de Kruskal, qui construit en prenant les arêtes par poids croissant : est l'état de la structure unir & trouver au moment où il ne reste que classes, et toutes les arêtes prises jusque-là pèsent . Supposons deux points et de groupes différents avec . Kruskal aurait examiné avant d'atteindre , donc à un instant où et étaient déjà dans des classes distinctes — les classes ne font que fusionner. Il l'aurait donc prise, et et se retrouveraient dans le même groupe. Contradiction.
Second temps : aucune répartition ne fait mieux. Soit une autre répartition en groupes. Comme et que les deux ont groupes, il existe deux points et dans le même groupe de et dans deux groupes différents de . Le chemin de à dans reste entièrement dans un groupe de , donc toutes ses arêtes pèsent . Ce chemin part d'un groupe de et arrive dans un autre : il contient donc une arête dont les extrémités sont dans deux groupes différents de . L'espacement de est majoré par le poids de cette arête, donc par .
2. L'algorithme, et c'est Kruskal arrêté plus tôt.
(* Repartition de n points en k groupes d'espacement maximal.
Entrees : n >= k >= 1, une liste d'aretes (i, j, distance).
Sortie : la structure unir & trouver dont les classes sont les groupes,
et l'espacement obtenu.
Complexite : O(m log m), m = n(n-1)/2 pour un nuage de points. *)
let regrouper n k aretes =
let triees = List.sort (fun (_,_,a) (_,_,b) -> compare a b) aretes in
let u = creer n and espacement = ref infinity in
List.iter (fun (a, b, d) ->
if u.classes > k then ignore (unir u a b)
else if !espacement = infinity && trouver u a <> trouver u b then
espacement := d (* la 1re arete NON prise : l'espacement *)
) triees;
(u, !espacement)
Le lien avec Kruskal est une identité, pas une analogie : c'est exactement Kruskal, arrêté quand il ne reste plus que classes au lieu de . Il prend donc les arêtes les plus légères de l'arbre couvrant minimal, ce qui revient à en retirer les plus lourdes. Et l'espacement est la première arête écartée pour cause de groupes distincts après l'arrêt.
3. La vérification. Huit points du plan :
L'arbre couvrant minimal des distances a pour arêtes triées, en poids :
Pour , on retire les deux plus lourdes, et . Les groupes obtenus sont , , — les trois amas —, et l'espacement vaut . Une énumération exhaustive des répartitions de huit points en trois groupes non vides confirme : est le maximum, et il est atteint par cette répartition.
Ce que le problème enseigne. La minimisation d'un poids total (l'arbre couvrant minimal) et la maximisation d'une distance minimale (l'espacement) semblent sans rapport ; c'est la structure de l'arbre couvrant qui les relie. C'est le même retournement qu'au problème « Le chemin le plus large », où l'arbre couvrant maximal résolvait un problème de goulot. L'arbre couvrant en dit plus que son poids.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.