Adloun

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.