Graphes et algorithmes TP 1


Avant tout, récupérez le fichier graphes.tar.gz et décompressez-le :

    gunzip graphes.tar.gz
    tar xvf graphes.tar
    rm graphes.tar
    cd Graphes; ls


1. Etudiez les structures de données cell et graphe (fichier graphes.h).

Notez qu'il est prévu de réserver pour les arcs du graphe plus de place que nécessaire (narc), ce qui permet de modifier un graphe en lui retirant ou en lui rajoutant des arcs (dans la limite de nmaxarc).

Les cellules de liste seront allouées en une seule fois à l'initialisation de la structure (fonction InitGraphe, fichier graphes.c) et stockées dans le tableau reserve, pour éviter des appels répétés (et coûteux) à la fonction système malloc.


2. Editez les fichiers main1.c et graphes.c . Lisez les descriptions des fonctions GrapheAleatoire, AfficheSuccesseurs, Sym définies dans graphes.c. Compilez et exécutez pour différentes tailles de graphes, par exemple :
    cc -Aa graphaux.c graphes.c main1.c -lm -o main1
    ./main1

usage: a.out <nombre sommets> <nombre arcs>

    ./main1 10 20

Pour de petits graphes, vous pouvez visualiser le graphe généré en affichant le fichier graph.ps :

    ghostview graph.ps

Comment évolue le temps de calcul de Sym lorsque la taille du graphe augmente ? (on prendra par exemple n entre 100 et 4000, et m = 2n). Evaluez la complexité de l'algorithme de la fonction Sym.


3. Remplacez cette fonction par une fonction Symetrique que vous écrirez, basée sur un algorithme linéaire en temps de calcul. Vérifiez par des mesures de temps que votre algorithme se comporte de manière linéaire, sur quelques valeurs de n et m.


4. L'image ci-dessus à gauche est extraite d'une photographie de chambre à bulles (source CERN). A droite, l'image a été seuillée pour ne garder que les régions les plus claires. Le fichier barys.txt contient les coordonnées des barycentres de ces régions (la première ligne du fichier précise le nombre de points). Notre but est de reconstituer au mieux les trajectoires des particules (ensembles de points plus ou moins alignés) en négligeant les points isolés.

Ecrire un programme qui lit un fichier de points, et construit un graphe antisymétrique sans boucle tel que :

Ce graphe sera représenté en mémoire, à la fois sous la forme ``successeurs'' et sous la forme ``liste d'arcs''. De plus, les poids qui seront associés aux arcs seront les distances entre les points correspondant aux extrémités, et les coordonnées des sommets seront stockées dans les champs x et y de la structure graphe.

Visualiser les graphes obtenus pour différentes valeurs de d. Peut-on trouver une valeur qui permette d'isoler les ``points de bruit'' des ``trajectoires de particules'' ?


5. Quelle est (approximativement) la valeur minimale dmin de d telle que le graphe obtenu soit connexe ? Proposez (sans l'implémenter) une méthode pour trouver la valeur exacte de dmin pour un ensemble de points donné. Complexité de la méthode ?


6. Calculez sur le graphe connexe obtenu en 5. un arbre de poids minimum. Commentez le résultat obtenu, en particulier : quels sont les défauts de la méthode ? Avez-vous des idées pour pallier ces défauts ?