Deux représentations d'un graphe
Exercice · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Graphes et plus courts chemins
Énoncé
Écrire une fonction qui, à partir d'une matrice d'adjacence, construit le dictionnaire des listes d'adjacence — et la fonction réciproque.
Corrigé
def matrice_vers_listes(A):
return {i: [j for j in range(len(A)) if A[i][j]]
for i in range(len(A))}
def listes_vers_matrice(D):
n = len(D)
A = [[0] * n for _ in range(n)]
for i in D:
for j in D[i]:
A[i][j] = 1
return A
Les deux sont réciproques sur les graphes simples : partir d'une matrice, la convertir et revenir redonne la matrice de départ. On peut le tester en une ligne : listes_vers_matrice(matrice_vers_listes(A)) == A.
Ce qu'on gagne et ce qu'on perd. La matrice occupe cases quel que soit le nombre d'arêtes, et répond en à « et sont-ils voisins ? ». Les listes occupent une place proportionnelle au nombre d'arêtes — un avantage décisif sur les graphes creux, comme les réseaux routiers — et donnent les voisins d'un sommet immédiatement, mais répondent en à la question précédente.
Une limite. Ces conversions perdent les poids : elles ne valent que pour un graphe non pondéré. Avec des poids, il faudrait remplacer la liste par une liste de couples .
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.