33
Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Embed Size (px)

Citation preview

Page 1: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Chapitre VIII.Introduction aux graphes

Définitions

Structures de données

Connexité

Arbre couvrant de poids minimal

Parcours des graphes orientés

Page 2: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

DéfinitionsGraphes orientés

• Un graphe orienté :• - ensemble des sommets• - ensemble des arcs : relation binaire

sur N

• Exemple :

),( ANG

inN

ji nnA ,

1

2 3

4

N=?, A=?

Page 3: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Arcs et sommets

jiij nna ,

in

jn

- l’extrémité initiale (début)

- l’extrémité terminale (fin)

est un prédécesseur de

est un successeur de

jn

jn

jn jn

Page 4: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Etiquettes

• Etiquettes

• Le nom d’un sommet doit être unique dans un graphe

• Plusieurs sommets peuvent avoir la même étiquette

1 2

Anne Claude

Est fille de

Page 5: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Chemins

• Un chemin dans un graphe orienté est une liste

• La longueur d’un chemin est k-1 = nbr arcs faisant partie du chemin

• Le cas trivial k=1: tout sommet n isolé est un chemin de longueur zéro de n à n

1,...,1,,:,..., 121 kiAnnnnn iik

Page 6: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Graphes cycliques et acycliques

• Un cycle dans un graphe orienté est un chemin de longueur 1 ou plus qui part et aboutit au même sommet

• Un chemin trivial (l=0) n’est pas un cycle • Une chemin composé d’un seul arc est un cycle

de longueur 1

Si un graphe a un ou plusieursCycles on l’appelle « graphe cyclique »Sinon « acyclique »

)3,3(,3,2,4,3

1

2 3

4

Page 7: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Problème

• Dans un graphe orienté- itinéraire représenté sous forme d’une liste simplement chainée supprimer tous les cycles

Page 8: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Graphes non-orientés

• Une arête est un ensemble de deux sommets • L’arête indique que les sommets sont

liés dans deux directions

• Les sommets sont dits adjacents

• Un graphe ayant des arêtes, c’est –à-dire possédant une relation symétrique des arcs est appelé un graphe non-orienté

ji nn ,

Page 9: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Structures de données

• (1) Listes d’adjacence• Type Liste =^maillon• Maillon=Enregistrement

• IdNoeud : Nœud {entier- pour simplifier}• Suivant: Liste

• Fin• Nœuds : tableau[1…N] de Liste

Page 10: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Exemple

1

2

3

4

7

5

6

1

2

6

78

5 7

3

4

Graphe orienté

Page 11: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Matrice d’adjacence

• arcs : tableau[1..N][1..N] de Booléen

010000008

000000007

000001006

001010005

000000004

000000103

000000012

010100001

87654321

Page 12: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Représentation d’un graphe non-orienté

1

2

3

4

7

5

6

1

2

6

78

5 7

3

4

Principe : remplacer chaque arête par les arcs allant dans deux directions, matrice d’adjacence est symétrique

Transformer le GO en GNO!

Page 13: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Connexité(1)

• Composante connexe : ensemble de sommets pour lesquels il existe un chemin entre tout sommet et n’importe quel autre sommet

• Une composante connexe est maximale : aucun sommet faisant partie d’une composante connexe ne possède un chemin vers un sommet en dehors de la composante connexe

• Si un graphe consiste en une seule composante connexe, alors on l’appelle graphe connexe

Page 14: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Connexité(2)

• Connexité est une relation d’équivalence définie sur les sommets du graphe non-orienté P:

• niPnj ssi il existe un chemin de ni vers nj

• 1) Réflexive : nPn pour tout sommet n puisqu’il existe un chemin de longueur 0 entre tout sommet et lui-même

• 2) Symétrique : si niPnj alors il existe un chemin de ni vers nj. Puisque le graphe est non-orienté, la séquence inverse de sommets est aussi un chemin. Donc njPni

• 3) Transitive : si niPnj et njPnk alors niPnj.

Page 15: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Algorithme pour construire les composantes connexes(1)

• Principe : • - Commencer par le graphe G0 composé des sommets

de G avec aucune arête. • - Considérer les arêtes de G une par une pour construire

une séquence des graphes G0, G1, G, … où Gi est composé des sommets de G et des i premières arêtes de G

Page 16: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Algorithme pour construire les composantes connexes(2)

• La base : la liste des arêtes non-utilisées est vide• Initialisation. G0 est seulement composé des sommets de G sans

arêtes. Chaque sommet est une composante connexe.• La récurrence. On suppose qu’on a les composantes connexes du

graphe Gi après avoir considéré les i premières arêtes. Considérons i+1 ère arête (ni, nj)

• 1. Si ni et nj font partie de la même composante de Gi , alors Gi+1 a le même ensemble des composantes connexes.

• 2. Si ni et nj font partie de composantes différentes, on fusionne les composantes contenant ni et nj afin d’obtenir les composantes connexes pour Gi+1

• Lorsqu’on a considéré toutes les arêtes de cette manière, on obtient les composantes connexes du graphe G

Page 17: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Construction des composantes connexes (2)

• Problèmes à résoudre : • (1) Etant donné un sommet, trouver sa

composante courante• (2) Fusionner deux composantes en une seule

• Choix de structures de données : chaque composante connexe d’un graphe sera représentée par un arbre.

• Le résultat de l’algorithme : une forêt des arbres

Page 18: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Construction des composantes connexes(3)

1 2

3

4

5

6

12

3

4

56

Deux polygones sont considérés adjacents ssi ils ont une arête commune

7

8

7

8

Page 19: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Construction des composantes connexes(4)

1

2

3

4

5

6

7

8

O

J

BC

Ve

R

Vi

B

Ro

2 6

1 3

42

5 6

4 6

1 5 4

8

7

6

Page 20: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Construction des composantes connexes(5)

• Liste des arêtes

1 2 3

2 6 4

3 4 3

4 6 5

5 7 8

6 5 4

7 1 2

8 1 6

N°arête N1 N2

Page 21: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Structures de données(1)• -Liste d’adjacence• -Liste des arêtes.• -Liste des nœuds d’un arbre

• Type ListeArêtes = ^Arête• Arête = Enregistrement• noeud1, noeud2 : TypeNoeud• Suivant : ListeArêtes• FinEnregistrement

• Arêtes : ListeArêtes• Tout sommet du graphe doit posséder un nœud d’arbre

correspondant• TypeNœud peut être une étiquette de nœud (entier)

Page 22: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Structures de données(2)

• Type PtrNoeudArbre = ^NoeudArbre• NoeudArbre = Enregistrement• père : PtrNoeudArbre• hauteur: entier• Fin Enregistrement• Nœuds: Tableau[1..n] de PtrNoeud• Ce tableau associe un nœud dans un

arbre général à chaque sommet du graphe

Page 23: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Fonctions auxiliaires

• (1)Fonction TrouveRacine( a: nœud): PtrNoeudArbre• { renvoie la racine de l’arbre contenant le nœud x correspondant au

sommet courant du graphe}• Var Racine, Courant : PtrNoeudArbre;• Début• Racine : = nœuds[a];• TQ Racine.père<>NIL faire

– Racine:=Racine^.père;

FTQ

Retourner Racine

FinTrouveRacine

Page 24: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Fonctions Auxiliaires (2)• (2)Procédure FusionArbres(x,y,: PtrNoeudArbre)• {fusionne les arbres dont les racines sont x et y, en faisant devenir racine du

plus bas le descendant de la racine du plus haut}• Var pbas, phaut : PtrNoeudArbre• Début• Si x^.hauteur>y^.hauteur

alors phaut:=x pbas=:=ysinon phaut:= y pbas:=x

FSi pbas^.père:= phaut; Si pbas^.hauteur = pahaut^.hauteur alors phaut^.hauteur:=phaut^.hauteur+1 FSI FinFusionArbres

Page 25: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Algorithme de construction des composantes connexes

• Soient G – le graphe contenant n sommets, e: sa liste des arêtes « arêtes »

• 1) Initialiser n arbres• 2)Pour toutes les arêtes dans la liste : • Si les extrémités sont dans deux arbres

différents, fusionner les composantes-arbres.

Page 26: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Algorithme de construction des composantes connexes(2)

• Procédure CompCon(réf Noeuds : Tableau [1..n]de PtrNoeuds; arêtes : ListeArêtes)

• Var u:TypeNoeud• a,b: PtrNoeudArbre• e:ListeArêtes• Pour u de 1 à n faire• new(Noeuds[u])• Nœuds[u].père:=NIL• Nœuds[u].hauteur:=0;• FPour• e:=arêtes• TQ e<>NIL faire• a:=TrouveRacine(e^.noeud1)• b:=TrouveRacine(e^.noeud2)• Si a<>b alors• FusionArbres(a,b); FSi• E:=e^.suivant• FTQ• FinCompCon

Page 27: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Analyse• Après l’exécution le tableau « Nœuds » code les arbres-

composantes-connexes. • Temps d’exécution• (1) FusionArbre : le chemin de n’importe quel nœud d’un arbre

construit par la procédure FusionArbre : le temps est inférieur à log(n). Alors TrouveRacine prend un temps en O(log(n))

• (2) Procédure FusionArbres : O(1) • (2)Initialisation (boucle Pour) O(n)• (3)Boucle while : O(mlog(n)), m – nombre des arêtes• O(n+mlog(n))• En général donc O(n+mlog(n)) –cas spécifiques • - absence des arêtes O(n)• - fortement connexe O(mlog(n))

Page 28: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Arbre couvrant de poids minimal

• Soit W={wi,j} l’ensemble des « poids » des arêtes du graphe G.

• Nous allons nous limiter aux graphes connexes• Un arbre couvrant (non-ordonné, sans racine = un

graphe non-orienté n’ayant pas de cycles) • Un arbre couvrant pour un graphe non-orienté G est

composé des sommets de G avec un sous-ensemble des arêtes de G qui – relient les sommets : il existe un chemin entre tous les sommets,

pris deux par deux, en prenant uniquement les arêtes de l’arbre couvrant

– forment un arbre sans racine, non-ordonné• Un arbre couvrant de poids minimal: la somme des poids

des arêtes est la plus petite que possible

Page 29: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Algorithme de Kruskal

• 1. Considérer les arêtes dans l’ordre croisant de leurs poids

• 2. Considérant les arêtes, • Si une arête possède ses deux extrémités dans

des composantes différentes, alors – on sélectionne cette arête pour l’arbre couvrant et on

fusionne les composantes de la même façon que dans l’algorithme de construction des composantes connexes.

• sinon – on ne sélectionne pas l’arête pour l’arbre couvrant.

Page 30: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Parcours des graphes orientés(1)

• Recherche en profondeur (dfs)• Principe : similaire au parcours en

profondeur des arbres.• Pb : existence des cycles ( possibilité de

boucler à l’infini!)• Solution : marquer les sommets visités• Structures de données : Graphe : tableau

de sommets avec des listes d’adjacence

Page 31: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Parcours des graphes orientés(2)

• Type Liste =^maillon• Maillon=Enregistrement

• IdNoeud : Nœud {entier}• Marque: (visité, non-visité)• Suivant: Liste

• Fin• Graphe : tableau[1…N] de Liste

Page 32: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Parcours des graphes orientés(3)• Parcours en profondeur• Procédure dfs(G: Graphe; u: entier){numéro du nœud )• Var p:Liste {liste d’adjacence du nœud u}• V: entier {sommet dans la cellule sur lequel pointe p}• Début• G[u].Marque:=Visité• p:=G[u].suivant• TQ p<>NIL faire

v:=p^.IdNoeudSi G[v].Marque:=Non-visité

alors dfs(v) FSi p:=p^.suivant FTQ Findfs

• Le temps d’exécution est proportionnel au nombre des arcs explorés.• Version itérative :utilisation d’une pile de parcours

Page 33: Chapitre VIII. Introduction aux graphes Définitions Structures de données Connexité Arbre couvrant de poids minimal Parcours des graphes orientés

Parcours des graphes orientés(4)

• Parcours en largeur : visiter d’abord tous les voisins du sommet courant qui n’ont pas été marqués

• Procédure bfs( G : graphe, u:entier)• Var v,w,i: entiers• F: file• Début• F:=file-vide; G[u].Marque:=Visité• Enfiler(F,u)• TQ non est-vide(F) faire• v: = premier(F); Defiler(F);• p:=G[v].suivant• TQ p<>NIL faire• w:=p^.IdNoeud• Si G[w].Marque:=Non-visité • alors• G[w].Marque=Visité• Enfiler(F,w)• FSi

FTQ• FTQ Finbfs