Page principale   Liste des composants   Liste des fichiers   Composants   Déclarations  

graphes.h

Aller à la documentation de ce fichier.
00001 
00004 #include <stdlib.h>
00005 #include <stdio.h>
00006 #include <string.h>
00007 #include <math.h>
00008 
00009 #define M_PI     3.14159265358979323846
00010 #define max(X,Y) ((X)>=(Y)?(X):(Y))
00011 #define min(X,Y) ((X)<=(Y)?(X):(Y))
00012 
00013 /* ================================================ */
00014 /* types publics */
00015 /* ================================================ */
00016 
00020 typedef struct cell {
00022   int som;
00024   double v_arc; 
00026   struct cell * next; 
00027 } cell;
00028 
00032 typedef cell * pcell; 
00033 
00034 
00038 typedef struct graphe {
00039 
00040   /* informations globales */
00041 
00043   int nsom;         
00045   int nmaxarc;      
00047   int narc;         
00048 
00049   /* representation par listes chainees de successeurs (application gamma) */
00050 
00052   pcell reserve;    
00054   pcell libre;      
00056   pcell * gamma;    
00057 
00058   /* representation par liste d'arcs 
00059      (vecteurs tete (sommet initial), queue (sommet final)) */
00060 
00062   int *tete;        
00064   int *queue;       
00065 
00066   /* informations additionelles ajoutees aux arcs */
00067 
00069   double *v_arcs;
00070 
00071   /* informations additionelles ajoutees aux sommets */
00072 
00074   double *v_sommets;
00075 
00077   double *x;        
00079   double *y;        
00081   char **nomsommet; 
00082 } graphe;
00083 
00084 /* ================================================ */
00085 /* prototypes */
00086 /* ================================================ */
00087 
00088 /* ====================================================================== */
00089 void AfficheEnsemble(boolean *s, int n);
00090 /* Donnee s : un tableau de valeurs booleennes.
00091    Donnee n : la taille du tableau.
00092    Fonction : affiche l'ensemble represente par le tableau de booleens s. */
00093 /* ====================================================================== */
00094 
00095 /* ====================================================================== */
00096 void AfficheListe(pcell p);
00097 /* Donnee p : une liste chainee de successeurs.
00098    Fonction : affiche le contenu de la liste p. */
00099 /* ====================================================================== */
00100 
00101 /* ====================================================================== */
00102 void AfficheSuccesseurs(graphe * g) ;
00103 /* Donnee g : un graphe.
00104    Fonction : affiche le graphe dans sa representation "listes de successeurs". */
00105 /* ====================================================================== */
00106 
00107 /* ====================================================================== */
00108 void AfficheArcs(graphe * g);
00109 /* Donnee g : un graphe.
00110    Fonction : affiche le graphe dans sa representation "listes d'arcs". */
00111 /* ====================================================================== */
00112 
00113 /* ====================================================================== */
00114 void AfficheValeursSommets(graphe * g);
00115 /* ====================================================================== */
00116 
00117 /* ====================================================================== */
00118 void PSGraphe(graphe * g, char *filename, double r, double t, double marge);
00119 /* Donnee g : un graphe.
00120    Donnee filename : nom du fichier postscript a generer.
00121    Donnee r : rayon des cercles qui representent les sommets (0 pour ne pas les dessiner).
00122    Donnee t : taille (demi-longueur) des fleches pour les arcs (0 pour ne pas les dessiner).
00123    Donnee marge : marge en x et en y.
00124    Fonction : genere une figure PostScript d'apres la representation "successeurs"
00125               du graphe g. */
00126 /* ====================================================================== */
00127 
00128 /* ====================================================================== */
00129 /* ====================================================================== */
00130 /* FONCTIONS DE PLONGEMENT DE GRAPHES DANS LE PLAN */
00131 /* ====================================================================== */
00132 /* ====================================================================== */
00133 
00134 /* ====================================================================== */
00135 void AutoNomsSommets(graphe * g, int mode);
00136 /* Donnee g : un graphe.
00137    Donnee mode : 1 pour que les noms soient les indices des sommets,
00138                  2 pour que les noms soient les valeurs associées aux sommets,
00139                  3 pour des noms composes de l'indice et de la valeur.
00140    Fonction : génère automatiquement des noms pour les sommets du graphe g.  */
00141 /* ====================================================================== */
00142 
00143 /* ====================================================================== */
00144 void PlongementCirculaire(graphe * g, double r);
00145 /* Donnee g : un graphe.
00146    Donnee r : le rayon du cercle.
00147    Resultat g : le graphe g modifie.
00148    Fonction : affecte a chaque sommet des coord. (x,y) regulierement reparties
00149               sur un cercle. */
00150 /* ====================================================================== */
00151 
00152 /* ====================================================================== */
00153 void PlongementRadial(graphe * g, int c);
00154 /* Donnee g : un graphe.
00155    Donnee c : le sommet a placer au centre.
00156    Resultat g : le graphe g modifie.
00157    Fonction : repartit les sommets de g sur des cercles concentriques en fonction 
00158               de leur rang, avec le sommet c au centre. */
00159 /* ====================================================================== */
00160 
00161 /* ====================================================================== */
00162 /* ====================================================================== */
00163 /* FONCTIONS SUR LES LISTES CHAINEES DE SOMMETS */
00164 /* ====================================================================== */
00165 /* ====================================================================== */
00166 
00167 /* ====================================================================== */
00168 pcell AlloueCell(pcell * plibre);
00169 /* Donnee plibre : pointeur sur une liste chainee de cellules libres.
00170    Resultat : pointeur sur une cellule.
00171    Fonction : retire la premiere cellule de la liste pointee par plibre
00172               et retourne un pointeur sur cette cellule */
00173 /* ====================================================================== */
00174 
00175 /* ====================================================================== */
00176 void LibereCell(pcell * plibre, pcell p);
00177 /* Donnee plibre : pointeur sur une liste chainee de cellules libres.
00178    Donnee p : pointeur sur une cellule.
00179    Fonction : insere la cellule p au debut de la liste pointee par plibre */
00180 /* ====================================================================== */
00181 
00182 /* ====================================================================== */
00183 void RetireTete(pcell * plibre, pcell * pliste);
00184 /* Donnee plibre : pointeur sur une liste chainee de cellules libres.
00185    Donnee pliste : pointeur sur une liste.
00186    Fonction : retire la premiere cellule de la liste 'pliste'. La cellule
00187               est chainee a la liste plibre. */
00188 /* ====================================================================== */
00189 
00190 /* ====================================================================== */
00191 void AjouteTete(pcell * plibre, pcell * pliste, int a);
00192 /* Donnee plibre : pointeur sur une liste chainee de cellules libres.
00193    Donnee pliste : pointeur sur une liste.
00194    Donnee a : un index de sommet.
00195    Fonction : ajoute une cellule contenant la valeur 'a' en tete de la liste
00196               'pliste'. La cellule est prise dans la liste 'plibre'. */
00197 /* ====================================================================== */
00198 
00199 /* ====================================================================== */
00200 int EstDansListe(pcell p, int a);
00201 /* Donnee p : une liste chainee de successeurs.
00202    Donnee a : une valeur entiere.
00203    Resultat : booleen.
00204    Fonction : retourne 1 si la valeur 'a' se trouve dans la liste p, 0 sinon. */
00205 /* ====================================================================== */
00206 
00207 /* ====================================================================== */
00208 /* ====================================================================== */
00209 /* FONCTIONS D'ALLOCATION / LIBERATION POUR UN GRAPHE */
00210 /* ====================================================================== */
00211 /* ====================================================================== */
00212 
00213 
00214 /* ====================================================================== */
00215 graphe * InitGraphe(int nsom, int nmaxarc);
00216 /* Donnee nsom : nombre de sommets.
00217    Donnee nmaxarc : nombre maximum d'arcs.
00218    Resultat : un graphe.
00219    Fonction : alloue la memoire necessaire pour representer un graphe a 'nsom' sommets,
00220               possedant au maximum 'nmaxarc' arcs. 
00221               Retourne un pointeur sur la structure allouee. */
00222 /* ====================================================================== */
00223 
00224 /* ====================================================================== */
00225 void TermineGraphe(graphe * g);
00226 /* Donnee g : un graphe.
00227    Fonction : libere la memoire occupee par le graphe g. */
00228 /* ====================================================================== */
00229 
00230 /* ====================================================================== */
00231 graphe * ReadGraphe(char * filename);
00232 /* Donnee filename : nom du fichier graphe.
00233    Resultat : un graphe.
00234    Fonction : Lit les donnees d'un graphe dans le fichier filename,
00235               retourne un pointeur sur la structure graphe construite. */
00236 /* ====================================================================== */
00237 
00238 /* ====================================================================== */
00239 /* ====================================================================== */
00240 /* FONCTIONS DE MANIPULATION DES ARCS (APPLICATION GAMMA UNIQUEMENT) */
00241 /* ====================================================================== */
00242 /* ====================================================================== */
00243 
00244 /* ====================================================================== */
00245 void AjouteArc(graphe * g, int i, int s);
00246 /* Donnee g : un graphe.
00247    Donnee i, s : deux sommets de g.
00248    Resultat g : le graphe modifie.
00249    Fonction : ajoute l'arc (i,s) au graphe g (application gamma seulement). */
00250 /* ====================================================================== */
00251 
00252 /* ====================================================================== */
00253 void RetireArc(graphe * g, int i, int s);
00254 /* Donnee g : un graphe.
00255    Donnee i, s : deux sommets de g.
00256    Resultat g : le graphe modifie.
00257    Fonction : retire l'arc (i,s) du graphe g (application gamma seulement),
00258               si celui-ci etait present. Sinon, pas d'action. */
00259 /* ====================================================================== */
00260 
00261 /* ====================================================================== */
00262 int PopSuccesseur(graphe *g, int i);
00263 /* Donnee g : un graphe.
00264    Donnee i : un sommet de g.
00265    Resultat : indice de sommet.
00266    Fonction : retire un arc (i,s) du graphe g (application gamma seulement),
00267               et retourne le sommet s. */
00268 /* ====================================================================== */
00269 
00270 /* ====================================================================== */
00271 int EstSuccesseur(graphe *g, int i, int s);
00272 /* Donnee g : un graphe.
00273    Donnee i, s : deux sommets de g.
00274    Resultat : booleen.
00275    Fonction : retourne 1 si le sommet 's' est un successeur du sommet 'i', 0 sinon  */
00276 /* ====================================================================== */
00277 
00278 /* ====================================================================== */
00279 /* ====================================================================== */
00280 /* FONCTIONS DE GENERATION DE GRAPHES */
00281 /* ====================================================================== */
00282 /* ====================================================================== */
00283 
00284 /* ====================================================================== */
00285 graphe * GrapheAleatoire(int nsom, int narc);
00286 /* Donnee nsom : nombre de sommets.
00287    Donnee narc : nombre d'arcs.
00288    Resultat : un graphe.
00289    Fonction : retourne un graphe aleatoire a 'nsom' sommets et 'narc' arcs. 
00290               Le graphe est asymetrique et sans boucle.
00291               Le nombre d'arcs doit etre <= nsom (nsom - 1) / 2.
00292    Remarque : la methode employee ici est naive, tres inefficace du point de vue
00293               temps de calcul et ne garantit aucune propriete statistique. */
00294 /* ====================================================================== */
00295 
00296 /* ====================================================================== */
00297 /* ====================================================================== */
00298 /* OPERATEURS DE BASE SUR LES GRAPHES */
00299 /* ====================================================================== */
00300 /* ====================================================================== */
00301 
00302 /* ====================================================================== */
00303 graphe * Symetrique(graphe * g);
00304 /* Donnee g : un graphe.
00305    Resultat : un graphe.
00306    Fonction : construit et retourne le graphe g_1 symetrique du graphe g. 
00307    ATTENTION : seule la representation 'gamma' est utilisee. */
00308 /* ====================================================================== */
00309 
00310 /* ====================================================================== */
00311 graphe * FermetureSymetrique(graphe * g);
00312 /* Donnee g : un graphe.
00313    Resultat : un graphe.
00314    Fonction : construit et retourne la fermeture symetrique du graphe g. 
00315    ATTENTION : seule la representation 'gamma' est utilisee. */
00316 /* ====================================================================== */
00317 
00318 /* ====================================================================== */
00319 void CompFortConnexe(graphe * g, graphe *g_1, int a, boolean * Ca);
00320 /* Donnee g : un graphe.
00321    Donnee g_1 : le graphe symetrique de g.
00322    Donnee a : un sommet du graphe g.
00323    Resultat Ca : un sous-ensemble des sommets de g (tableau de booleens).
00324    Fonction : retourne la composante fortement connexe de g contenant a. */
00325 /* ====================================================================== */
00326 
00327 /* ====================================================================== */
00328 boolean ExisteCircuit(graphe * g, int a);
00329 /* Donnee g : un graphe.
00330    Donnee a : un sommet du graphe g.
00331    Resultat : booleen
00332    Fonction : teste l'existence d'un circuit dans g contenant a 
00333 /* ====================================================================== */
00334 
00335 /* ====================================================================== */
00336 void CompConnexe(graphe * g, graphe *g_1, int a, boolean * Ca);
00337 /* Donnee g : un graphe.
00338    Donnee g_1 : le graphe symetrique de g.
00339    Donnee a : un sommet du graphe g.
00340    Resultat Ca : un sous-ensemble de sommets de g (tableau de booleens).
00341    Fonction : retourne la composante connexe de g contenant a. */
00342 /* ====================================================================== */
00343 
00344 /* ====================================================================== */
00345 boolean Connexe(graphe * g, graphe *g_1);
00346 /* Donnee g : un graphe.
00347    Donnee g_1 : le graphe symetrique de g.
00348    Resultat : booleen.
00349    Fonction : retourne TRUE si le graphe est connexe, FALSE sinon. */
00350 /* ====================================================================== */

Généré le Fri Apr 2 14:43:33 2004 pour Graphes par doxygen1.2.18