29
Structures de données IFT-2000 Abder Alikacem Abder Alikacem Les graphes (1) Semaine 6 Département d’informatique et de génie logiciel Édition Septembre 2009

Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Embed Size (px)

Citation preview

Page 1: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Structures de donnéesIFT-2000

Abder AlikacemAbder Alikacem

Les graphes (1)

Semaine 6

Département d’informatique et de génie logiciel

Édition Septembre 2009

Page 2: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Plan

• Introduction• Nomenclature des graphes• Matrice de connectivité• Clôture transitive: algorithme de Warshall• Plus court chemin: algorithme de Floyd

4

25

3

1

Page 3: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Fermeture transitive des graphes

Définition

Soit G un graphe orienté de n noeuds.

Soit A la matrice de nœuds adjacents correspondant.

Soit Bn-1 = A + A2 + A3 … + An-1

la matrice P est appelée fermeture ou clôture transitive du graphe G (dans notre cas, on a une clôture par produits de matrices).

Complexité ?

Bn-1 P : matrice de booléens qui indique s’il existe un chemin entre toutes paires de nœuds

Page 4: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Exemple

graphe G graphe H

1 2

3

4

1 2

3

4

Fermeture transitive des graphes

H : la fermeture transitive de A.

Page 5: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

P0 = 0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 0

P1 =

P2 =

P3 =

P4 =

34

1 2

0 1 0 1 0 0 1 0 0 1 0 1 1 1 0 1

0 1 1 1 0 0 1 0 0 1 1 1 1 1 1 1

0 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

Algorithme deWarshall

34

1 2

34

1 2

34

1 2

34

1 2

Page 6: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Algorithme de Warshall{Soit A, un graphe orienté}

1. [Initialisation]P A

2. [Boucle sur tous les sommets intermédiaires]Pour k = 1, 2, ..., n répéter jusqu'à l'étape 4.

3. [Boucle sur les sommets de départ]Pour i = 1, 2, ..., n répéter l'étape 4.

4. [Boucle sur les sommets adjacents]Pour j = 1, 2, ..., n répéterPij Pij ou (Pik et Pkj)

5. [Fin de l'algorithme]Stop

Algorithme de Warshall

Complexité ?

Page 7: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

34

1 2

P0 = 1 1 1 1 1 1 1

P1 =

P2 =

P3 =

P4 =

1 1 1 1 1 1 1 2 1 2 1 1 1 2 1 1 1 2 2

1 2 1 2 1 2 1 2 1 1 1 2 2

2 1 2 1 3 2 1 2 2 1 2 1 1 1 2 2

Algorithme de Floyd

pour k = 1 à n faire

pour i = 1 à n faire

pour j = 1 à n faire

C [i, j] MIN { C [i, j] , C [i, k] + C [k, j] } ;

Page 8: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Algorithme de Floyd{Soit A, un graphe orienté.}

1. [Initialisation]C A

2. [Boucle sur les sommets intermédiaires]Pour k = 1, 2, ..., n répéter jusqu'à l'étape 4.

3. [Boucle sur les sommets de départ]Pour i = 1, 2, ..., n répéter l'étape 4.

4. [Boucle sur les sommets adjacents]Pour j = 1, 2, ..., n répéterCij MIN (Cij , Cik + Ckj)

5. [Fin de l'algorithme]Stop

Algorithme de Floyd

Complexité ?

Page 9: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

C0 = W =

9

240 78

1

0 1 8 0 4 7 0 9 0 2 0

C1 = 0 1 8 0 4 7 0 9 0 1 0

C2 = 0 1 5 8 0 4 7 0 9 0 1 5 0

C3 = 0 1 5 8 0 4 13 7 0 9 0 1 5 0

C4 = 0 1 5 8 13 0 4 13 9 7 0 9 0 1 5 0

34

1 2

Matrice des poids :

W [i,j] = 0 si i = jv((i,j)) si (i, j) A sinon

Algorithme de Floyd et les distances

Page 10: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

C0 = W =

0 1 8 0 4 7 0 9 0 2 0

C1 = 0 1 8 0 4 7 0 9 0 1 0

C2 = 0 1 5 8 0 4 7 0 9 0 1 5 0

C3 = 0 1 5 8 0 4 13 7 0 9 0 1 5 0

C4 = 0 1 5 8 13 0 4 13 9 7 0 9 0 1 5 0

- 1 - 1 - - 2 - - 3 - 3 4 4 - -

P1 =

P2 =

P3 =

P4 =

P0 =

- 1 - 1 - - 2 - - 3 - 3 4 1 - -

- 1 2 1 - - 2 - - 3 - 3 4 1 2 -

- 1 2 1 - - 2 3 - 3 - 3 4 1 2 -

- 1 2 1 4 - 2 3 4 3 - 3 4 1 2 -

9

240 78

1

34

1 2

Matrice des prédécesseurs Pk [i, j] = prédécesseur de j sur un plus court chemin de i à j dont les sommets intermédiaires sont tous k

Algorithme de Floyd et les chemins

Page 11: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

C4 = 0 1 5 8 13 0 4 13 9 7 0 9 0 1 5 0

P4 =

- 1 2 1 4 - 2 3 4 3 - 3 0 1 2 -

Exemple de chemin

distance de 2 à 1 = C4[2,1] = 13

P4[2,1] = 4 ; P4[2,4] = 3 ; P4[2,3] = 2 ;

2 34

49

10

9

240 7

8

1

34

1 2

Algorithme de Floyd

Page 12: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Structures de donnéesIFT-2000

Abder AlikacemAbder Alikacem

Les graphes (2)

Semaine 6

Département d’informatique et de génie logiciel

Édition Septembre 2009

Page 13: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Plan

• Parcours d’un graphe par contagion (ou largeur)• Parcours d’un graphe par sondage (ou profondeur)• Description d’un graphe en terme de type abstrait• Implantation

4

2

5

3

1

Page 14: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Défilement d’un graphe

• opération importante visite d’un graphe• problème : éviter les circuits !!!• solution : marquer les nœuds (Petit-Poucet)

4

2

5

3

1

x xx

Page 15: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Marquer les nœuds (Petit-Poucet)

De nombreux algorithmes relatifs aux graphes nécessitent une procédure qui permet l'examen systématique des noeuds et des arêtes (arcs) d'un graphe G donné.

La procédure consiste à classer les sommets en 3 catégories:• La catégorie A des sommets déjà visités.• La catégorie B des sommets adjacents à ceux de la catégorie

A mais pas encore visités (sommets qui peuvent être atteints).• La catégorie C des sommets invisibles qui n'ont pas encore

été rencontrés du tout (qui ne peuvent pas être atteints depuis un sommet déjà visité).

Page 16: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Les différentes variantes de parcours dépendront de la manière dont on fait passer les sommets de la catégorie C à la catégorie B et de la B dans la A.

On construit l'état initial en plaçant le sommet de départ dans la catégorie B et tous les autres dans la catégorie C.

On répète alors :

faire passer un sommet x de la catégorie B à la catégorie A;

mettre dans la catégorie B tous les sommets de catégorie C

adjacents à x.

Marquer les nœuds (Petit-Poucet)

Il existe deux manières standard d'exécuter ces opérations:

Parcours par contagion ou par largeur Breadth-First Search ou BFS

Parcours par sondage ou en profondeur(Depth-First Search ou DFS)

Page 17: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Au cours de l'exécution de nos algorithmes, chaque noeud N de G sera dans l'un des trois états suivants :

STATUS = 1  : (Prêt) État initial du noeud N

STATUS = 2  : (Attente) Le noeud N est soit empilé, soit dans la file d'attente, en attente d'être traité.

STATUS = 3  : (Traité) Le noeud N a été traité.

Marquer les nœuds (Petit-Poucet)

Noter qu’au lieu de marquer les nœuds par 1, 2 ou 3, peut simplement le faireen utilisant un booléen:

•vrai : le nœud est soit traité soit en attente d’être traité (status =1 ou 2)•Faux: le nœud n’a pas été parcouru (status = 1)

Page 18: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

A

BCF

D

J K

GE

Exemple

Défilement d’un graphe

Page 19: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Spécifications de l’interface du type Graphe

Description en termes de types abstraits

1. ajouter un sommet à un graphe 2. ajouter un arc/arête à un graphe3. ôter un sommet du graphe et tous les arcs/arêtes associés4. ôter un arc/arête 5. permettre l'accès à un sommet nommé (désigné)6. indiquer si un sommet n'a pas de voisins7. parcourir les voisins d'un sommet (parcours) 8. voir si un chemin existe entre 2 sommets9. trouver le chemin le plus court (# arêtes/arcs, distance)10. trouver tous les chemins entre 2 sommets• Etc..

Page 20: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Implantation

Il existe 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 ou d’arêtes possibles:

NbArcs / NbSommets2 dans le cas de graphe orienté.NbAretes / (NbSommets(NbSommets-1)/2) dans le cas d’un graphe non orienté

Page 21: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Interface

template <typename T>class Graphe {public:/** Constructeur (graphe vide)*/ Graphe(); /** Constructeur à partir des sommets et arcs/arêtes*/ Graphe(vector<T> sommets, vector<Arete> aretes); Graphe (const Graphe&); Graphe(const Graphe&g,vector<T>sommets); ~Graphe (); Graphe& operator = (const Graphe&); void ajouterSommet(T s); void ajouterArc (T s1, T S2); void enleverArc (T s1, T s2); void enleverSommet ( T s); bool sommetExiste(T s) const; int nbSommets() const; // etc... private: //…

class Arete{public: int u; int v; Arete(int u, int v) {this->u = u; this->v = v; }}

class Sommet{public: …getData(); void setData(..); //etc..

private: … data; int no; int tag; bool pres;}

Page 22: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

template <typename T>class Graphe {public: //..private:

int nbSommets;T* sommets;

int **mat; //implémentation dans une matrice} // de sommets adjacents

4

25

3

1

Cas d’un graphe orienté

Implantation dans une matrice d’adjacence

Page 23: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

template <typename T>class Graphe {public: //..private:

int nbSommets;T* sommets;

int **mat; // trop de perte mémoire!!

}

Cas d’un graphe non orienté

4

25

3

1

Implantation dans une matrice d’adjacence

Linéariser la matrice

Page 24: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

template <typename T>class Graphe {public: //..private:

int nbSommets;T* sommets;

int *mat; // tableau à une dimension

}

Cas d’un graphe non orienté

4

25

3

1

Implantation dans une matrice d’adjacence

1

1 1

1 1

1

0

1

2

3

4 1

1 1

1

1

1

11 11 11

( i + 1 ) * i / 2 + j

Page 25: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

template <typename T>class Graphe {public: //..private:

vector<T> sommets; // Les sommets vector< vector<int> > voisins; // Les sommets adjacents

}

Implantation dans une matrice d’adjacence

Utilisation de vector de la STL

Page 26: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

template <typename T>class Graphe { public: //.. private:

private:class Noeud{ public:

T data; /* au lieu de T data, on peut avoir T* ou int*/Noeud * suivant; /* chaînage des sommets adjacents */

};/* le noeud typique du graphe */int nbSommet; /* nombre de sommets dans le graphe */int nbSommetMax; /* nombre total possible de sommets */T * sommet; /* tableau représentant les sommets*/Noeud** listeSommet; /* les listes de sommets adjacents*/

}

Implantation dans une liste de sommets adjacents

2 3123

1

1

2

1

2 3

Page 27: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

template <typename T>class Graphe { public: //.. private:

class Noeud { public: T data; //données

// dans un sommet list<int> voisins; };

vector<Noeud> listeSommets;}

Implantation dans une liste de sommets adjacents

Utilisation de vector et list de la STL

Page 28: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

Implantation dans une liste de sommets adjacents

Cas d’un graphe non orienté

• La liste des sommets adjacents

soufre de la même redondance que

nous avons rencontrer avec les matrices de sommets adjacents.

• Une solution plus efficace • utilisation de listes

d’arêtes• Elle consiste à lier les arêtes

• un lien pour chaque arête vers les 2 sommets

délimitant l’arête.

Page 29: Structures de données IFT-2000 Abder Alikacem Les graphes (1) Semaine 6 Département dinformatique et de génie logiciel Édition Septembre 2009

Classe Graphe

template <typename T>class Graphe { public: //.. private:

class AreteNode { public:

int sommet[3]; AreteNode * lien[3];

}; typedef AreteNode * AretePtr;

class Noeud { public: T data; AretePtr first; };vector<Noeud> listeSommets;

}

Cas d’un graphe non orienté

Liste des arêtes