19/03/2020
1
Introduction aux graphes
19/03/2020
2
Définitions
Un graphe est un couple G = (S, A)
où S est un ensemble (l'ensemble des sommets) et A est une partie de S x S, l'ensemble des arêtes.
• Deux arêtes (s, t) et (s', t') sont consécutives si t = s' A = {(1, 2), (1, 4), (2, 4), (4, 3)}
Arêtes consécutives (1, 2) et (2, 4)
19/03/2020
3
Définitions
• Un chemin dans un graphe est une suite d'arêtes consécutives.
• (1, 4), (4, 3), (3, 2) : chemin du sommet 1 au sommet 2
• Graphe non dirigé : si (s, t) est une arête, (t, s) est une arête
19/03/2020
4
• Défintions
• Un graphe G est composé de deux ensembles S et A :
• S est un ensemble fini d’éléments, appelés sommets
• A est un ensemble fini d’éléments, appelés arcs
• Notion d’arc
• un arc a est un élément du produit cartésien des sommets S × S :
• il est noté a = (i , j) où i et j sont dans S
• A traduit une organisation relationnelle des sommets entre eux.
19/03/2020
5
Défintions
• Concept d’orientation
• graphe non orienté : (i , j) = (j , i)
• graphe orienté : (i , j) ≠ (j , i)
• G = (S,A) :
• S = {1, 2, 3, 4}
• A = {(1, 2), (2, 3), (3, 1), (3, 4)}
19/03/2020
6
Notation et
Terminologie
• Notation
• si un graphe à n sommets, les sommets sont notés 1, 2, . . . , n
• un arc orienté est noté(i , j ), où i et j sont pris dans l’intervalle 1..n
• Terminologie
• Sommets adjacents: Si (a, b) est un arc alors a et b sont des sommets adjacents
• Arc incident
• Si (a, b) est un arc, alors :
• (a, b) est un arc incident extérieurement à a
• (a, b) est un arc incident intérieurement à b
• Degré d’un sommet nombre d’arcs incidents au sommet
19/03/2020
7
Degré
• Soit u ∈ S un sommet de G et d(u), le degré de u
• d(u) est le nombre d'arcs ou d'arêtes incidents à u
• si G est orienté :
• de (u) (le degré entrant) est le nombre d'arcs qui arrivent à u. (x, u)
• ds (u) (le degré sortant) est le nombre d'arcs qui partent de u. (u, x)
• d(u) = de (u) + ds (u)
19/03/2020
8
Exemple
19/03/2020
9
Terminologie (suite)
• Chemin:séquence de sommets (s0, s1, s2, . . . , sp−1, sp) où (s0, s1), (s1, s2, ), . . . , (sp−1, sp) sont des arcs
• la longueur d’un chemin (s0, s1, ..., sp) vaut p
• un chemin simple est un chemin qui ne comporte pas plusieurs fois le même arc
• un chemin élémentaire est un chemin qui ne passe pas plus d’une fois par le même sommet
• un circuit est un chemin de la forme (s0, s1, s2, ..., sp−1, s0)
• Graphe valué :graphe où une valuation est associée à chaque arc
19/03/2020
10
Représentation par une matrice d’adjacence
• Soit G un graphe à n sommets notés 1, 2, . . . , n
• G est représenté par une matrice A[1..n][1..n]
• Graphe non valué
• si (i , j) est un arc de G alors
• A[i ][j ] =1
• sinon
• A[i ][j ] =0
• finsi
• Graphe valué
• si (i , j) est un arc de G valué par v alors
• A[i ][j ] = v
• sinon
• A*i +*j + une valeur particulière qui dénote l’absence d’arc
• finsi
19/03/2020
11
Matrice d’adjacence d’un graphe
• Exemple:
•
19/03/2020
12
Représentation par une liste d’adjacence
• Liste des arcs
• G est représenté par une liste d’arcs (i , j)
• Listes d’adjacence
• G est représenté par une liste de sommets ls
=< s1, . . . , sn >
• chaque élément si de la liste ls est une liste qui contient les sommets successeurs du sommet i dans le graphe G
19/03/2020
13
Représentation par une liste d’adjacence
•
19/03/2020
14
Représentation par une liste d’adjacence
• en C :
• typedef struct cel{
• int st;
• struct cel* suiv;
• }cellule;
• typedef cellule* Liste;
• typedef struct{
• Liste a[N_MAX];
• int n;
• }grapheL;
19/03/2020
15
Parcours d’un graphe
• Parcours de tous les sommets
• visiter chaque sommet du graphe une seule fois
• appliquer un même traitement en chaque sommet
19/03/2020
16
Parcours à partir d’un sommet s
• parcours en profondeur
• le principe consiste à descendre le plus
”profond” dans le graphe à partir de s, avant de revenir pour prendre une autre direction
• parcours en largeur
• le principe consiste à visiter les sommets
situés à une distance 1 de s, puis ceux situés à une distance 2 de s, etc...
19/03/2020
17
Parcours à partir d’un sommet s
• il faut un mécanisme pour éviter de boucler indéfiniment :
• Marquer les noeuds
• Lister les noeuds traités
19/03/2020
18
Parcours en largeur
• principe de l'algorithme
• 1- Dans le parcours en largeur, on utilise une file.
On enfile le sommet de départ.
• 2-On visite les voisins de la tête de file. On les enfile (en les numérotant au fur et à mesure de leur découverte) s'ils ne sont pas déjà présents dans la file, ni déjà passés dans la file.
• 3-On défile
• 4-On recommence au point 2 (tant que la file n'est pas vide).
19/03/2020
19
Parcours en largeur
• Dans un parcours en largeur, on visite en
premier lieu tous les sommets à une distance 1 du départ, puis tous les sommets à une
distance 2 du départ,…
• Pour tout sommet u du graphe P[u] sera le père de u, c’est-à-dire le sommet à partir duquel le sommet u à été découvert lors du parcours.
19/03/2020
20
Parcours en largeur
• Pour tout sommet u du graphe couleur[u]
vaut blanc si u n’est pas passé dans la file, gris s’il est dans la file, noir lorsqu’il sorti de la file.
• On utilise une file f, on enfile un sommet
lorsqu’il est découvert, on le défile lorsqu’il est exploité.
19/03/2020
21
Exemple de parcours en largeur
• Soit le graphe suivant et sa représentation par une liste d’adjacence:
19/03/2020
22
Exemple de parcours en largeur
19/03/2020
23
Exemple de parcours en largeur
•
19/03/2020
24
Exemple de parcours en largeur
•
19/03/2020
25
Exemple de parcours en largeur
•
19/03/2020
26
Exemple de parcours en largeur
•
19/03/2020
27
Exemple de parcours en largeur
•
19/03/2020
28
Exemple de parcours en largeur
•
19/03/2020
29
Exemple de parcours en largeur
•
19/03/2020
30
Exemple de parcours en largeur
•
19/03/2020
31
Exemple de parcours en largeur
•
19/03/2020
32
Parcours en largeur: algorithme
• PL(G,s)
• for x in G : couleur[x]='blanc‘
• P[x]=None
• d[x]=
• P[s]=None
• d[s]=0
• couleur[s]='gris‘
• f=file_vide()
• f=enfiler(f,s)
• while !est_vide(f)
• u=head(f)
• for v in add[u] :
• if couleur[v]=='blanc'
• P[v]=u
– d[v]= d[u]+1
• couleur[v]='gris'
• f=enfiler(f,v)
• f=defiler(f)
• couleur[u]='noir'
• return P
19/03/2020
33
Chemin entre deux sommets
• chemin(G,s,v) :
• P=PL(G,s)
• ch=liste_vide();
• ch=inserer(ch,0,v)
• while P[v] :
• ch=inserer(ch,0,P[v])
• v=P[v]
• return ch
19/03/2020
34
Parcours en profondeur
• principe de l'algorithme
• La stratégie suivie par un parcours en profondeur est de descendre plus profondément dans le graphe chaque fois que c’est possible. Lors d’un parcours en profondeur, les arcs sont explorés à partir du sommet v découvert le plus récemment et dont on n’a pas encore exploré tous les arcs incidents. Lorsque tous les arcs de v ont été explorés,
l’algorithme revient en arrière pour explorer les arcs qui partent du sommet à partir duquel v a été découvert. Ce processus est répété jusqu’à ce que tous les sommets
accessibles à partir du sommet origine aient été découverts.
19/03/2020
35
Exemple de Parcours en profondeur
•
19/03/2020
36
Exemple de Parcours en profondeur
•
19/03/2020
37
Exemple de Parcours en profondeur
•
19/03/2020
38
Exemple de Parcours en profondeur
•
19/03/2020
39
Exemple de Parcours en profondeur
•
19/03/2020
40
Exemple de Parcours en profondeur
•
19/03/2020
41
Exemple de Parcours en profondeur
•
19/03/2020
42
Exemple de Parcours en profondeur
•
19/03/2020
43
Exemple de Parcours en profondeur
•
19/03/2020
44
Exemple de Parcours en profondeur
•
19/03/2020
45
Exemple de Parcours en profondeur
•
19/03/2020
46
Exemple de Parcours en profondeur
•
19/03/2020
47
Exemple de Parcours en profondeur
•
19/03/2020
48
Exemple de Parcours en profondeur
•
19/03/2020
49
Exemple de Parcours en profondeur
19/03/2020
50
Exemple de Parcours en profondeur
•
19/03/2020
51
Exemple de Parcours en profondeur
•
19/03/2020
52
Arborescence associée au parcours
•
19/03/2020
53
Parcours en profondeur: algorithme
• Parcours_prof(graphe G, sommet s)
• couleur[s]gris
• pour tout v in add[s] faire
–Si couleur[v]= =blanc alors
• Parcours_prof(G,v) Finsi
Finpour
couleur[s]noir fin
19/03/2020
54
Exemple de parcours
•
• (a)un graphe G, (b) la liste d’adjacence de G
19/03/2020
55
Exemple de parcours
• Parcours en profondeur: v0, v1, v3, v7, v4, v5, v2, v6
• Parcours en largeur: v0, v1, v2, v3, v4, v5, v6, v7