Adloun

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.