La distance par les puissances
Exercice · niveau 3 (difficile) · 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 distance(A, i, j) qui renvoie la longueur du plus court chemin de à , ou s'il n'en existe pas, en calculant les puissances successives de . Pourquoi peut-on s'arrêter à ?
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 distance(A, i, j):
n = len(A)
if i == j:
return 0
P = A # P vaut A^d au tour d
for d in range(1, n): # d = 1, 2, ..., n-1
if P[i][j] > 0:
return d
P = produit(P, A)
return -1
Pourquoi suffit. Un plus court chemin ne repasse jamais par un même sommet : s'il le faisait, on pourrait supprimer la portion comprise entre les deux passages et raccourcir — ce qui contredirait la minimalité. Il visite donc des sommets deux à deux distincts, au plus , et emprunte au plus arêtes.
Si pour tout , aucun chemin ne relie à , et est la bonne réponse.
C'est le même argument que dans la caractérisation de la connexité par : au-delà de , on ne découvre plus rien.
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.