Aller au contenu

Chapitre 6 - Partie 2 : Graphes et représentations


Un graphe est constitué de :

  • sommets (ou nœuds) : les éléments du graphe ;
  • arêtes (graphe non orienté) ou arcs (graphe orienté) : les liaisons entre sommets.

Les liaisons sont symétriques : si A est relié à B, alors B est relié à A.

A --- B
| / |
| / |
C --- D

Les liaisons ont un sens : A → B ne signifie pas forcément B → A.

A ──→ B
↑ ↙ |
| / ↓
C ←── D
TermeGraphe non orientéGraphe orienté
LiaisonArêteArc
VoisinAdjacentSuccesseur / Prédécesseur
Nombre de liaisons d'un sommetDegréDegré entrant / degré sortant
Chemin ferméCycleCircuit
Tous les sommets accessiblesConnexeFortement connexe

Un graphe pondéré associe un poids (coût, distance, durée) à chaque arête ou arc.

A ─5─ B
| |
3 2
| |
C ─4─ D

SituationSommetsArêtes/ArcsOrienté ?Pondéré ?
Réseau routierVillesRoutesNon (ou oui pour sens uniques)Oui (km)
Réseau social (amitié)PersonnesRelations d'amitiéNonNon
Réseau social (abonnement)Personnes« suit »OuiNon
InternetRouteursLiens physiquesNonOui (débit)
WebPagesLiens hypertextesOuiNon
Plan de métroStationsLignesNonOui (temps)

Un tableau 2D où la case (i,j)(i, j) vaut 1 si les sommets ii et jj sont reliés, 0 sinon.

Pour le graphe non orienté A-B-C-D ci-dessus :

A B C D
A [ 0, 1, 1, 0 ]
B [ 1, 0, 1, 1 ]
C [ 1, 1, 0, 1 ]
D [ 0, 1, 1, 0 ]
matrice = [
[0, 1, 1, 0],
[1, 0, 1, 1],
[1, 1, 0, 1],
[0, 1, 1, 0]
]
  • Graphe non orienté : la matrice est symétrique (M[i][j]=M[j][i]M[i][j] = M[j][i]).
  • Graphe orienté : la matrice n'est pas forcément symétrique.
  • Graphe pondéré : on remplace 1 par le poids et 0 par ∞\infty (ou None).
  • Espace mémoire : O(n²) où n est le nombre de sommets.
AvantageInconvénient
Vérifier si deux sommets sont voisins en O(1)Occupe O(n²) de mémoire
Simple à implémenterGaspillage si le graphe a peu d'arêtes

Un dictionnaire où chaque sommet est associé à la liste de ses voisins (ou successeurs pour un graphe orienté).

graphe = {
"A": ["B", "C"],
"B": ["A", "C", "D"],
"C": ["A", "B", "D"],
"D": ["B", "C"]
}
graphe_oriente = {
"A": ["B"],
"B": ["D"],
"C": ["A"],
"D": ["C"]
}
graphe_pondere = {
"A": [("B", 5), ("C", 3)],
"B": [("A", 5), ("D", 2)],
"C": [("A", 3), ("D", 4)],
"D": [("B", 2), ("C", 4)]
}
AvantageInconvénient
Économe en mémoire pour les graphes peu densesVérifier si deux sommets sont voisins en O(degré)
Parcourir les voisins d'un sommet est rapide

def matrice_vers_liste(matrice, sommets):
graphe = {}
for i in range(len(sommets)):
voisins = []
for j in range(len(sommets)):
if matrice[i][j] == 1:
voisins.append(sommets[j])
graphe[sommets[i]] = voisins
return graphe
def liste_vers_matrice(graphe, sommets):
n = len(sommets)
matrice = [[0] * n for _ in range(n)]
index = {s: i for i, s in enumerate(sommets)}
for sommet in graphe:
for voisin in graphe[sommet]:
matrice[index[sommet]][index[voisin]] = 1
return matrice
sommets = ["A", "B", "C", "D"]
mat = [[0,1,1,0],[1,0,1,1],[1,1,0,1],[0,1,1,0]]
print(matrice_vers_liste(mat, sommets))
# {'A': ['B', 'C'], 'B': ['A', 'C', 'D'], 'C': ['A', 'B', 'D'], 'D': ['B', 'C']}

def degre_matrice(matrice, sommet):
return sum(matrice[sommet])
def degre_liste(graphe, sommet):
return len(graphe[sommet])
def nb_aretes(matrice):
total = sum(matrice[i][j] for i in range(len(matrice))
for j in range(len(matrice)))
return total // 2
class Graphe:
def __init__(self, sommets):
self.sommets = sommets
self.adjacence = {s: [] for s in sommets}
def ajouter_arete(self, s1, s2):
self.adjacence[s1].append(s2)
self.adjacence[s2].append(s1)
def voisins(self, s):
return self.adjacence[s]
def degre(self, s):
return len(self.adjacence[s])
def nb_aretes(self):
return sum(len(v) for v in self.adjacence.values()) // 2
def __str__(self):
lignes = []
for s in self.sommets:
lignes.append(f"{s} → {self.adjacence[s]}")
return "\n".join(lignes)
g = Graphe(["A", "B", "C", "D"])
g.ajouter_arete("A", "B")
g.ajouter_arete("A", "C")
g.ajouter_arete("B", "C")
g.ajouter_arete("B", "D")
g.ajouter_arete("C", "D")
print(g)
print(f"Degré de B : {g.degre('B')}") # 3
print(f"Nombre d'arêtes : {g.nb_aretes()}") # 5

ConceptDescription
GrapheSommets reliés par des arêtes (non orienté) ou des arcs (orienté)
Matrice d'adjacenceTableau 2D, symétrique pour un graphe non orienté. O(n²) mémoire
Liste d'adjacenceDictionnaire sommet → liste de voisins. Économe en mémoire
DegréNombre de voisins d'un sommet
Graphe pondéréChaque arête porte un poids (distance, coût)
ConversionOn peut passer d'une représentation à l'autre