Académique Documents
Professionnel Documents
Culture Documents
1ère année
1 Graphes non-orientés
Un graphe non-orienté G est un couple (S, A) où S est un ensemble et A est un ensemble contenant
des paires d’éléments de S (c’est-à-dire des parties à deux éléments de S).
Les éléments de S sont appelés les sommets (ou nœuds) du graphe G et ceux de A les arêtes de G.
Derrière cette définition formelle, il faut garder à l’esprit l’idée suivante : un graphe, c’est un ensemble
de sommets dont certains sont reliés entre eux par des arêtes. On utilise d’ailleurs très souvent une repré-
sentation graphique de ces objets. Par exemple, le graphe G0 = (S, A) avec
S = {a, b, c, d, e, f, g, h} et A = {{a, b} , {a, d} , {b, c} , {c, d} , {c, e} , {d, e} , {f, g}} est représenté par :
b c e
f g
h
d
a
Il faut noter que comme les éléments de A sont des paires, il n’y a pas d’ordre privilégié dans leur écriture.
La paire {a, b} est la même que la paire {b, a}.
Deux sommets reliés par une arête sont dit voisins ou adjacents.
Dans le graphe G0 défini plus haut, a et b sont voisins mais d et b ne le sont pas. L’ensemble des voisins
de c est {b, d, e}.
On appelle degré d’un sommet le nombre de ses voisins. Pour un sommet s, on le note d(s).
On peut par exemple compléter le tableau suivant pour le graphe G0 :
Sommet a b c d e f g h
Degré
4 4 3
4
3 2 2 2
3
5
0 1 0 1 0
1
5 5
2 Graphes orientés
Un graphe orienté G est un couple (S, A) où S est un ensemble et A est un ensemble contenant des
couples d’éléments de S.
Les éléments de S sont appelés les sommets (ou nœuds) du graphe G et ceux de A les arcs (parfois
arêtes) de G.
Si (a, b) est une arête de G, on dit que l’arête va de a à b ou encore que a est l’extrémité initiale (ou
sommet de départ) et b l’extrémité finale (ou sommet d’arrivée)
L’idée est presque la même que précédemment, à la différence que les arcs sont maintenant orientées :
ils ont tous un point de départ et un point d’arrivée. L’arc (a, b) n’est donc pas la même que l’arc (b, a).
Graphiquement, le changement s’opère en représentant les arc par des flèches, qui pointent vers le sommet
d’arrivée.
Par exemple, le graphe G1 = (S, A) avec S = {a, b, c, d, e, f, g, h, i, j} et
A = {(a, b), (b, a), (b, h), (h, d), (c, a), (d, e), (e, h), (c, f ), (f, g), (g, f ), (e, g), (i, j), (g, h)} est représenté
par :
c
f
b e
g
d h
a i j
Lorsqu’un arc (x, y) fait partie du graphe, on dit que x est un prédécesseur de y et que y est un
successeur de x Dans le graphe G1 , a et h sont les successeurs de b et a est l’unique prédécesseur de b.
On appelle degré sortant d’un sommet s le nombre de ses successeurs. C’est le nombre d’arcs qui
partent de ce sommet, on le note d− (s). Le degré entrant de s est le nombre de prédécesseurs de s
(c’est-à-dire le nombre d’arcs qui arrivent en s). On le note d+ (s).
Compléter le tableau suivant pour le graphe G1 :
Sommet a b c d e f g h i j
Degré entrant
Degré sortant
2 3
0 5
1 4
graphe G2 :
ou avec un dictionnaire
1 dico_listes_adjacence =
↪ {0:[1 ,2] ,1:[0 ,2 ,4] ,2:[0 ,1 ,3 ,4] ,3:[2] ,4:[1 ,2] ,5:[]}
Ainsi, pour savoir si deux sommets sont voisins, il suffit d’effectuer un test d’appartenance à une liste
1 >>> 1 in liste_listes_adjacence [2] # Teste si 1 est un voisin de 2.
2 True
3 >>> 1 in dico_listes_adjacence [2] # Teste si 1 est un voisin de 2.
4 True
2 3
0 5
1 4
graphe G3 :
1 >>> liste_listes_adjacence = [[1 ,3] ,[2 ,3] ,[0] ,[1 ,2] ,[] ,[4]]
2 >>> dico_listes_adjacence = {0:[1 ,3] ,1:[2 ,3] ,2:[0] ,3:[1 ,2] ,4:[] ,5:[4]}
3 >>> 1 in dico_listes_adjacence [2] # Teste si 1 est un successeur de 2.
4 False
Avantages et inconvénients.
La représentation sous cette forme est très compacte, puisqu’il suffit de stocker chaque arête/arc en
mémoire. De plus, on peut facilement accéder aux voisins et au degré (ou degré sortant) d’un sommet.
En revanche, l’accès au degré entrant (pour un graphe orienté) est nettement plus couteux en temps.
De plus, tester si une arête existe nécessite de parcourir toute la liste d’adjacence d’un sommet.
⎛0 1 1 0 0 0⎞ ⎛0 1 0 1 0 0⎞
⎜1 0 1 0 1 0⎟ ⎜0 0 1 1 0 0⎟
⎜ ⎟ ⎜ ⎟
⎜1 1 0 1 1 0⎟ ⎜1 0 0 0 0 0⎟
M2 = ⎜
⎜0
⎟, M3 = ⎜ ⎟
⎜ 0 1 0 0 0⎟
⎟
⎜0
⎜ 1 1 0 0 0⎟
⎟
⎜ ⎟ ⎜ ⎟
⎜0 1 1 0 0 0⎟ ⎜0 0 0 0 0 0⎟
⎝0 0 0 0 0 0⎠ ⎝0 0 0 0 1 0⎠
Soit en python :
1 M2 = [[0 ,1 ,1 ,0 ,0 ,0] ,[1 ,0 ,1 ,0 ,1 ,0] ,[1 ,1 ,0 ,1 ,1 ,0] ,[0 ,0 ,1 ,0 ,0 ,0] ,
↪ [0 ,1 ,1 ,0 ,0 ,0] ,[0 ,0 ,0 ,0 ,0 ,0]]
2 M3 = [[0 ,1 ,0 ,1 ,0 ,0] ,[0 ,0 ,1 ,1 ,0 ,0] ,[1 ,0 ,0 ,0 ,0 ,0] ,[0 ,1 ,1 ,0 ,0 ,0] ,
↪ [0 ,0 ,0 ,0 ,0 ,0] ,[0 ,0 ,0 ,0 ,1 ,0]]
Avantages et inconvénients.
Tester si une arête/un arc est présent se fait en temps constant. Trouver le degré entrant d’un sommet
dans un graphe orienté est plus rapide qu’avec les listes d’adjacence : Il suffit de parcourir la colonne
correspondant à ce sommet.
1 def degreEntrant ( graphe : list , sommet : int ) -> int :
2 """
3 Entr é es : Un graphe sous forme de matrice d ’ adjacence , un entier
4 qui est le num é ro d ’ un sommet du graphe .
5 Sortie : Le degr é du sommet ( son degr é entrant dans le cas orient é ) .
6 """
7 somme = 0
8 nb_sommets = len ( graphe )
9 for i in range ( nb_sommets ) :
10 if graphe [ i ][ sommet ] == 1:
11 somme +=1
12 return somme
En revanche, parcourir les voisins d’un sommet demande de parcourir toute une ligne de la matrice.
De plus, la matrice demande de stocker n2 coefficients pour un graphe à n sommets, ce qui peut être
problématique si l’on travaille sur un graphe avec beaucoup de sommets et (proportionnellement) peu
d’arêtes/arcs.
1 4
1 4
Un chemin est qualifié de cycle (ou circuit dans le cas orienté) si ses sommets de départ et d’arrivée
sont les mêmes et s’il ne passe que par des arêtes/arcs distincts. Dans le graphe non-orienté ci-dessus,
(0, 1, 2, 0) et (2, 4, 1, 0, 2) sont des cycles. Dans le graphe orienté, il y a par exemple les circuits (1, 5, 1) ou
encore (4, 1, 5, 2, 6, 3, 4).
Lorsqu’un graphe ne comporte aucun cycle, il est dit acyclique.
Une question naturelle se pose alors : Quels sommets est-il possible de relier ? C’est une question assez
simple lorsque l’on travaille sur un graphe de petite taille représenté graphiquement, mais on souhaite
disposer d’outils informatique pour automatiser cela et pouvoir le faire sur des graphes plus grands.
Un graphe non-orienté G est dit connexe si, pour deux sommets quelconques u et v de G, il existe un
chemin reliant u et v.
2 3
Exemple de graphe connexe.
0
1 4
Une technique classique pour savoir si un graphe est connexe consiste à « parcourir » le graphe en
partant d’un sommet, comme nous allons le voir dans la dernière section.
Cette fonction n’est pas très efficace algorithmiquement car la gestion des sommets à traiter par une
liste est sous-optimale : les manipulations sur les listes impliquées font augmenter la complexité.
Nous verrons au prochain chapitre comment utiliser des structures de données plus adaptées au parcours
de graphe.