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.