Académique Documents
Professionnel Documents
Culture Documents
3 Algorithme de Warshall
Lorsque le graphe orienté G est relativement gros, sa matrice d’ajacence A prend une grande place mémoire. Calculer
sa clôture transitive via la méthode précédente est compliquée et couteux en mémoire. On peux par contre calculer la
matrice Ā en utilisant seulement qu’une matrice.
Algorithme de Warshal:
Étape 0 : On pose B = (bij ) = A, où A est la matrice d’adjacence.
Étape 1 : On considère le sommet d’indice 1. On cherche toute les configuration de sommets d’indices j et k telles
que j 6= k, j 6= 1, k 6= 1. Pour chaque configuration de ce type on pose bjk = 1
Étape i : On considère le sommet d’indice i. On cherche toute les configuration de sommets d’indices j et k telles
que j 6= k, j 6= i, k 6= i. Pour chaque configuration de ce type on pose bjk = 1
On effectue ainsi n + 1 étapes.
1
3.1 Exemple
On considère le grahe orrienté G
2 3
Étape 1 : On cherche les configuration bj1 et b1k , j 6= k, j, k 6= 1. Ici on trouve 2 → 1 → 3, on pose donc b23 = 1
0 0 1 0
1 0 1 0
B= 0 1 0
0
0 1 1 0
1 1 1 0
Étape 4 : On cherche les configuration bj4 et b4k , j 6= k, j, k 6= 4. Il n’en existe pas car il n’y pas de flèches entrantes
sur le sommet 4.
2
Au final on obtient
0 1 1 0
1 0 1 0
B=
1
1 0 0
1 1 1 0
Qui est bien la matrice d’adjacence de la clôture transitive G0 de G:
2 3
4 Exercices
Exercice 1. Soit G le graphe orienté suivant:
1 2
6 3
5 4
Pour la suite, on représentera une matrice en Python par une liste de listes, chaque sous liste représentera un ligne de
la matrice.
Exercice 2.
2.1. Écrire une fonction afficheMat(M) qui affiche une matrice ligne par ligne.
2.2. Écrire une fonction matNulle(n) qui retourne une matrice nulle de taille n.
Exercice 3. Écrire une fonction creerMatriceAdjacence(G) qui reçevant le graphe G, codé par un dictionnaire
Python sous la forme nœud-liste de successeur, retourne la matrice d’adjacence (matrice 0-1) représentant le graphe.
Exercice 4.
4.1. Écrire une fonction somMatBool(A,B) qui prenant 2 matrices A et B à coefficients 0-1 renvoi la matrice somme
booléenne de A et B (on pourra utiliser l’opérateur or).
3
4.2. Écrire une fonction prodMatBool(A,B) qui prenant 2 matrices A et B à coefficients 0-1 renvoi la matrice produit
booléen de A et B.
4.3. Écrire une fonction puissMatBool(A,k) qui prenant une matrices A à coefficients 0-1 et un entier k renvoi la
matrice booléenne de Ak .
Exercice 5.
5.1. Écrire une fonction clotTransMat(G) qui prenant un graphe G retourne la matrice d’adjacence correspondant à
la clôture transitive de G
5.2. Écrire une fonction clotTransGraph(G) qui prenant un graphe G retourne le graphe correspondant à la clôture
transitive de G
Exercice 6. Écrire une fonction clotTransMatW(G) qui prenant un graphe G retourne la matrice d’adjacence corre-
spondant à la clôture transitive de G en utilisant l’algorithme de Warshall.