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 :
- à chaque point correspond un sommet du graphe,
- deux sommets sont reliés par un arc si la distance entre les points
correspondants est inférieure à un seuil d.
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 ?