Adloun

Compter les morceaux d'un graphe

Exercice · niveau 2 · mathématiques appliquées (ECG 1re année), chapitre 3 — Théorie des graphes · Analyse de réseaux, en Python

Énoncé

Écrire une fonction Python nb_composantes(A) qui renvoie le nombre de morceaux d'un graphe non orienté donné par sa matrice d'adjacence, en s'appuyant sur la matrice . Que vaut-elle sur un graphe connexe ?

Corrigé


def produit(A, B):
    n = len(A)
    return [[sum(A[i][k] * B[k][j] for k in range(n))
             for j in range(n)] for i in range(n)]

def nb_composantes(A):
    n = len(A)
    S = [[1 if i == j else 0 for j in range(n)] for i in range(n)]
    P = [ligne[:] for ligne in S]          # P vaut A^d au tour d
    for d in range(1, n):
        P = produit(P, A)
        for i in range(n):
            for j in range(n):
                S[i][j] = S[i][j] + P[i][j]
    vus = [False] * n
    c = 0
    for i in range(n):
        if not vus[i]:
            c = c + 1                      # un morceau de plus
            for j in range(n):
                if S[i][j] > 0:
                    vus[j] = True
    return c

Pourquoi c'est correct. signifie qu'il existe une chaîne de à de longueur au plus — et une chaîne de longueur minimale ne repasse jamais par un même sommet, donc emprunte au plus arêtes. Ainsi équivaut à « et sont dans le même morceau ». La seconde boucle marque d'un coup tout le morceau du premier sommet non encore vu, et l'incrémente une fois.

Le point délicat. S'arrêter avant conclurait à tort : dans un graphe en chaîne à six sommets, aller du premier au dernier demande cinq arêtes.

Le point à retenir. Sur un graphe connexe la fonction renvoie : le critère matriciel du cours en est le cas particulier. La matrice ne dit pas seulement oui ou non — elle contient la découpe entière du graphe.

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.