Tu as raison, l'algorithmique ne sort jamais d'un chapeau si on comprend ce qu'on fait et pourquoi on le fait. Si tu n'as pas de notions de base en algo tu ne pourras jamais construire de programmes efficaces. Si tu n'as pas une culture minimum en algo tu ne pourras pas construire de programmes efficients.
Les notions de base s'acquièrent en lisant et en faisant et refaisant les exos classiques jusqu'à devenir intime avec les objets manipulés et les manipulations basiques. La culture ensuite, ma foi, elle s'acquiert en étant curieux et en lisant, puis en comprenant la démarche.
L'expérience n'apporte pas grand chose de plus que la capacité à faire de bons choix plus tôt possible en connaissant les possibilités pour résoudre un problème donné avec les contraintes particulières.
Pour en revenir à ton problème, on peut le décrire ainsi →
- on a un ensemble V de nœuds
chaque nœud possède au moins une propriété : ses coordonnées dans un plan
le nombre de nœuds est une puissance de 2 moins 1;- un arête reliant deux nœuds aura un poids définit par W(u,v)=distance_euclienne(u.coordonnées, v.coordonnées);
- tu dois construire un arbre binaire complet utilisant tous les nœuds dont la somme des poids des arêtes doit être minimisée qui a la propriété supplémentaire que sa représentation graphique soit planaire.
Avec un peu de réflexion (et très rapidement) on peut penser à plusieurs approches :
- diviser pour régner/programmation dynamique → peut-on raisonner en fonction de problèmes identiques de tailles inférieures ? est-ce que résoudre ce problème revient à résoudre deux problèmes de taille 2n-1-1 ? Les cas n<3 étant triviaux.
- graphe → ça sent fort l'arbre couvrant avec des contraintes supplémentaires (planéarité, de type binaire complet), peut-on chercher du côté de chez Prim ou Kruskal ?
- graphe → de la même manière ça sent aussi le dessin planaire d'un graphe, peut-on utiliser les algos Tarjan Hopcroft de reconnaissance ? doit-on par exemple essayer de construire un arbre binaire complet en reliant les feuilles (y compris par des arcs courbes) pour avoir un graphe triangulaire ?
- graphe, algo géométriques → cette dernière remarque m'amène à la triangulation de Delaunay. Si tu construis un graphe triangulaire et que tu cherchais un arbre couvrant ? sans doute une autre piste à explorer …
- idée à la con → si tu construis un arbre couvrant minimum, que se passe-t-il si tu en détermines les centres (le ou les nœuds qui sont équidistants des extrémités) ? Aurais-tu de bons candidats de racines pour commencer la construction de ta solution ?
- la liste n'est pas exhaustive loin de là … à toi d'imaginer d'autres approches
Les pistes sont nombreuses, les contraintes fortes, surtout en compétition où tu as une limite aux temps de refléxion et d'implémentations sans compter les limites matérielles (1s de temps cpu, 256MB de mémoire, …).
Néanmoins c'est un très bon exercice qui va te permettre d'aborder de nombreux concepts avec lesquels tu n'es sans doute pas familier mais tu vas découvrir un monde assez magnifiques
D'autant plus qu'on ne te demandes pas un algo efficient mais juste un minimum efficace …
Partager