La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Modèles dimplantation Il existe plusieurs manières de représenter les graphes. Entre autres, sous forme graphique sous forme de listes de sommets et d'arcs.

Présentations similaires


Présentation au sujet: "Modèles dimplantation Il existe plusieurs manières de représenter les graphes. Entre autres, sous forme graphique sous forme de listes de sommets et d'arcs."— Transcription de la présentation:

1 Modèles dimplantation Il existe plusieurs manières de représenter les graphes. Entre autres, sous forme graphique sous forme de listes de sommets et d'arcs. La représentation graphique d'un graphe n'est toutefois utilisable que par un humain et uniquement si le graphe est peu dense ou contient relativement peu de sommets.

2 Modèles dimplantation La description sous forme de listes de sommets et d'arcs de ce graphe. G = (NOEUDS, ARC) NOEUDS = {A, B, C, D, E, F, G, H, I} ARCS = {AC, AD, BA, BB, BF, CE, CG, DA, ED, HE, HG}

3 Modèles dimplantation Deux principales méthodes de modélisation des graphes en tant que type abstrait: les matrices et les listes dites de connectivité ou d'adjacence. Le choix entre elles se fera en fonction de la densité du graphe. Par densité, on entend la proportion d'arcs effectifs par rapport au nombre maximum d'arcs possibles (NbArcs / NbSommets 2 ).

4 Modèles dimplantation Matrice de connectivité ou de noeuds adjacents Une matrice de valeurs booléennes de dimension NbSommets*NbSommets pour indiquer qu'il y a un arc entre un sommet x et un sommet y. Cette méthode de représentation est indiquée si le graphe est dense car il faut NbSommets 2 booléens pour stocker le graphe et NbSommets 2 étapes pour initialiser la matrice.

5 Modèles dimplantation matrice dadjacence :

6 Matrice dadjacence #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; BOOL arc[NB_SOMMET][NB_SOMMET]; } Graphe; int no; int tag; BOOL pres; char *nom; Sommet

7 Matrice triangulaire int no; int tag; BOOL pres; char *nom; Sommet #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; BOOL arc[NB_SOMMET][NB_SOMMET]; } Graphe;

8 matrice dadjacence : (avec graphe non orienté) On peut, pour un graphe non-orienté, économiser de l'espace en ne stockant que le triangle supérieur de la matrice symétrique. Matrice triangulaire possède n = [n (n+1)] / 2 éléments. On la représente dans un vecteur ayant ce même nombre d'éléments. Si on la range par ligne, alors le vecteur aura l'allure suivante : A 11 A 21 A 22 A 31 A 32 A 33 A A nn Matrice triangulaire

9 matrice dadjacence : (avec graphe non orienté) Matrice triangulaire. Si A 11 est en position 1 (indice inférieur du vecteur), alors l'adresse de A ij est donnée par : Adresse = A 0 + ( i - 1 ) * i / 2 + j Ainsi, la position de A 42 est A à Des matrices symétriques, pour lesquelles A ij = A ji pour peuvent être également représentées de cette façon Matrice triangulaire

10 Linéarisation dune matrice int main() { int *tab; int i, j, k=0; tab=(int*)calloc( MAX_LIGNES*MAX_COLONNES,sizeof(int)); for (i=0; i

11 Linéarisation dune matrice triangulaire int main() { int *tab; int i, j, k=0; tab=(int*) calloc( MAX_LIGNES*( MAX_LIGNES+1)/2, sizeof(int)); for (i=0; i

12 #include "ModeleImplantationTabInt.h" #define OK 0 #define PAM 1 TabInt initTabInt(int *err); /*..*/ int * set (int *tab, int x, int i, int j, int *err); /* permet de placer la donnée x dans la matrice en (i, j) exactement si on aurait à faire: tab[i][j] */ int get(int *tab, int i, int j, int *err); /* get permet de lire l'élément de matrice en (i,j) */ TabInt destroyTabInt(TabInt tab, int *err); /* */ #include #define MAX_LIGNES2 #define MAX_COLONNES3 typedef int * TabInt;

13 #include "TabInt.h" int main() { TabInt tab; int i, j, k=0; int err; tab= initTabInt(&err); /* tab= initTab(INT, 2, 3, &err);*/ for (i=0; i

14 int no; int tag; BOOL pres; char *nom; Sommet #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; BOOL arc[15]; } Graphe; Matrice triangulaire ( i + 1 ) * i / 2 + j

15 Matrice triangulaire int no; int tag; BOOL pres; char *nom; Sommet #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; BOOL * arc[NB_SOMMET]; } Graphe;

16 Matrice triangulaire int no; int tag; BOOL pres; char *nom; BOOL *arc; Sommet + #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; BOOL * arc[NB_SOMMET]; } Graphe;

17 Matrice triangulaire int no; int tag; BOOL pres; char *nom; Sommet #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; int * arc[NB_SOMMET]; } Graphe;

18 Matrice triangulaire int no; int tag; BOOL pres; char *nom; int *arc; Sommet + #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; int * arc[NB_SOMMET]; } Graphe;

19 Listes dadjacence int no; int tag; BOOL pres; char *nom; int *arc; Sommet #define NB_SOMMET 5 typedef struct { Sommet sommets[NB_SOMMET]; int * arc[NB_SOMMET]; } Graphe;

20 Listes dadjacence A B C D E F G H I A B C D E F G H I Nu méroNom Ptr.Listes des noeuds adjacents au n e noeud typedef struct noeud { int numSommetAdj; struct noeud* suivant; } Noeud; typedef struct { int nbNoeud; Sommet * listeNoeud; }Graphe; int no; int tag; BOOL pres; char *nom; Noeud *arc; Sommet

21 Listes dadjacence L'occupation mémoire d'une matrice de connectivité est inférieure à l'occupation mémoire de la liste de connectivité correspondante dès que la densité des arcs dépasse 3 %. La structure de liste nécessite moins d'étapes d'initialisation et de traitement mais cet avantage devient de moins en moins déterminant au fur et à mesure que la densité des arcs augmente. Il y a donc un compromis à trouver entre gain de temps et gain despace.

22 Listes croisées

23 Listes croisées

24 Listes croisées

25 Structure entièrement dynamique

26 Un modèle pour modéliser les dessertes dune compagnie aérienne Structure entièrement dynamique

27 typedef struct /*Modèle pour un graphe*/ { int nb_noeuds; /*Le nombre de noeuds dans le graphe*/ Noeud* noeudsOrigine; /*Pointeur sur les noeuds d'origine)*/ Noeud* noeudsDestination; /*Pointeur sur les noeuds de destination)*/ }Graphe;... Structure entièrement dynamique

28 typedef struct noeud /* Un noeud dans un graphe*/ { int numero; /*Le nom de la ville associée noeud*/ Arete* liste_adjacence; /*La liste des arêtes adjacentes*/ int status;/*Pour la recherche par contagion*/ struct noeud* suivant; /*Le prochain noeud de la liste*/ }Noeud; Structure entièrement dynamique

29 typedef struct Arete /*Une arête d'un graphe*/ { int numero_origine; /*Le numéro de la ville d'origine*/ int numero_destination; /*Le numéro de la ville de destination*/ float temps_vol; /*Pondération de l arête*/ struct Arete* suivante1; /*Prochaine adjacence du noeud sur une rangée*/ struct Arete* suivante2; /*Prochaine adjacence du noeud sur une colonne*/ }Arete; 1 Structure entièrement dynamique

30 On peut également envisager d'utiliser une autre structure entièrement dynamique en créant une chaîne décrivant les sommets du graphe, où chaque élément contiendrait le nom d'un sommet, un pointeur vers le sommet suivant ainsi qu'un pointeur vers une chaîne décrivant les arcs partant de ce sommet. On aurait ainsi une chaîne des sommets et, pour chaque élément de cette chaîne, une chaîne des arcs. Cela pourrait donner la structure suivante... Structure entièrement dynamique

31

32 Connexion Reseau NoeudChaine Serveur ListeDeConnexions Réseau Internet TP2 Automne 2005

33 typedef struct {int nbAretes;/* nb de liens dans le réseau */ int nbSommets;/* nb de serveurs dans le réseau */ NoeudChaine *serveurs; /* liste chaînée des serveurs*/ } Reseau;/* représente tout le réseau */ TP2 Automne 2005

34 typedef struct SNoeudChaine/* Liste chaînée de serveurs */ { Serveur s; struct SNoeudChaine *suivant; /* pointeur suivant */ struct SNoeudChaine *precedent; /* pointeur précédent */ }NoeudChaine; TP2 Automne 2005

35 typedef struct { Etiquette etiquette;/* étiquette dun serveur*/ ListeDeConnexions connexions;/* liste de ces connexions */ EtatParcours etat;/* pour les parcours */ } Serveur; TP2 Automne 2005

36 typedef struct { Connexion *premier; /* vers le début de la liste des connexions */ int card; /* le nombre déléments dans la liste */ } ListeDeConnexions; TP2 Automne 2005

37 typedef struct connexion { NoeudChaine *destination;/* pointeur sur le serveur s2 */ int charge;/* charge de l'arc s1-s2 */ struct connexion *suivant;/* vers un serveur adjacent à s1*/ } Connexion ; /* Connexion entre 2 serveurs s1 et s2 par exemple*/ TP2 Automne 2005

38 typedef struct noeud { TypeEl sommet; /* l'étiquette d'un sommet */ struct noeud* suivant; /* les listes de noeuds adjacents */ } Noeud;/* le noeud typique du graphe */ typedef struct { int nbNoeud; /* nombre de sommets */ TypeEl * tableauSommet;/* tableau des sommets*/ Noeud** listeNoeud;/* les listes de noeuds adjacents*/ }Graphe;/* le graphe */ Laboratoire #5

39 Laboratoire #5 typedef struct noeud { TypeEl sommet; struct noeud* suivan } Noeud; typedef struct { int nbNoeud; TypeEl * tableauSommet; Noeud** listeNoeud; }Graphe; 1 1 2

40 typedef struct nœud NœudAdjacent; typedef struct { int sommet; int status; Bool present; NoeudAdjacent * listeNoeud; } TypeEl;/* un sommet du graphe */ struct noeud { TypeEl sommet; struct noeud* adjacent; /* les listes de noeuds adjacents */ }; typedef struct { int nbNoeud; /* nombre de sommets */ TypeEl * tableauSommet;/* tableau des sommets*/ }Graphe;/* le graphe */ Laboratoire#5

41 typedef struct nœud NœudAdjacent; typedef struct { int sommet; int status; Bool present; NoeudAdjacent * listeNoeud; } TypeEl;/* un sommet du graphe */ struct noeud { TypeEl * sommet; struct noeud* adjacent; /* les listes de noeuds adjacents */ }; typedef struct { int nbNoeud; /* nombre de sommets */ TypeEl * tableauSommet;/* tableau des sommets*/ }Graphe;/* le graphe */ Laboratoire#5

42 typedef struct nœud NœudAdjacent; typedef struct { int sommet; int status; Bool present; NoeudAdjacent * listeNoeud; } TypeEl;/* un sommet du graphe */ struct noeud { TypeEl * sommet; int cout; struct noeud* adjacent; /* les listes de noeuds adjacents */ }; typedef struct { int nbNoeud; /* nombre de sommets */ TypeEl * tableauSommet;/* tableau des sommets*/ }Graphe;/* le graphe */ Laboratoire#5

43 typedef struct nœud NœudAdjacent; typedef struct { int sommet; int val; int status; Bool present; NoeudAdjacent * listeNoeud; } TypeEl;/* un sommet du graphe */ struct noeud { TypeEl * sommet; int cout; struct noeud* adjacent; /* les listes de noeuds adjacents */ }; typedef struct { int nbNoeud; /* nombre de sommets */ TypeEl * tableauSommet;/* tableau des sommets*/ }Graphe;/* le graphe */ Laboratoire#5

44 typedef struct nœud NœudAdjacent; typedef struct Tnoeud { int sommet; int val; int status; Bool present; NoeudAdjacent * listeNoeud; struct Tnoeud * autreSommet; } TypeEl;/* un sommet du graphe */ struct noeud { TypeEl * sommet; int cout; struct nœud * adjacent; /* les listes de noeuds adjacents */ }; typedef struct { int nbNoeud; /* nombre de sommets: optionnel */ TypeEl * tableauSommet;/* liste chaînée des sommets*/ } Graphe;/* le graphe */ Laboratoire#5

45 typedef struct tarete TArete ; typedef struct tnoeudObjet { intx, y; TArete*NoeudAdj; structtnoeudObjet *Suivant; }TNoeudObjet; struct tarete { TNoeudObjet *Objets; int cout; TArete*Suivant; }; typedef struct { TNoeudObjet *ListObjets; }Labyrinthe;

46 1.Écrire le modèle dimplantation 2.Écrire Graphe init(int *err); 3.Écrire Graphe detruireGraphe(Graphe g, int *err); Exercice

47 /* Structure pour représenter le graphe */ typedef struct { Sommet *lstSommets; /* la liste des sommets du Graphe */ } Graphe ;

48 /* Structure pour représenter un sommet du graphe */ typedef struct sommet { int etiquette; /* étiquette du Sommet */ int etat; /* état pour le parcours. 1 : Prêt, 2 : Attente, 3 : Traité */ struct sommet *smtSuivant; /*pointeur sur le prochain sommet dans la liste de sommets du Graphe*/ Arc *lstArc;/* la liste d'adjacence du Sommet */ } Sommet;

49 /* Structure pour la liste d'adjacence */ typedef struct arc { Sommet *smtAdj;/* pointeur sur le sommet adjacent */ struct arc *arcSuivant; /* Pointeur sur le prochaine arc*/ }Arc;

50 Corrigé typedef struct arc Arc; typedef struct sommet Sommet; /* Structure pour la liste d'adjacence */ struct arc { Sommet *smtAdj;/* pointeur sur le sommet adjacent */ Arc *arcSuivant; /* Pointeur sur le prochaine arc */ }; /* Structure pour représenter un sommet du graphe */ struct sommet { int etiquette; /* étiquette du Sommet */ int etat; /* état pour le parcours. 1 : Prêt, 2 : Attente, 3 : Traité */ Sommet *smtSuivant; /*pointeur sur le prochain sommet dans la liste de sommets du Graphe*/ Arc *lstArc;/* la liste d'adjacence du Sommet */ } ; /* Structure pour représenter le graphe */ typedef struct { Sommet *lstSommets; /* la liste des sommets du Graphe */ } Graphe ;


Télécharger ppt "Modèles dimplantation Il existe plusieurs manières de représenter les graphes. Entre autres, sous forme graphique sous forme de listes de sommets et d'arcs."

Présentations similaires


Annonces Google