Vous êtes sur la page 1sur 4

UNIVERSITÉ DE CAEN

UFR Sciences L3 MASS, L3 Maths


Optimisation Combinatoire
TP5 : Graphe orienté: cycle, chemin...

1 Algèbre de Boole et matrice booléenne


Une algèbre de boole sur l’ensemble {0, 1} est une structure A qui muni cet ensemble de 2 opérations internes ⊕ et ⊗
telles que
⊕ 0 1 ⊗ 0 1
0 0 1 0 0 0
1 1 1 1 0 1
Ces opérations respectent l’associativité, la commutativité ainsi que la distributivité de ⊕ par rapport à . Par
extension on peut alors définir des matrices à coefficient dans cette algèbre de Boole et munir ces matrices d’opérations
d’addition et de multiplication similaire à celles des matrices à coefficients réels. Soient donc A = (aij ) et B = (blk ),
avec 1 6 i 6 n, 1 6 j 6 p, 1 6 l 6 m, 1 6 k 6 q, des matrices à coefficient dans A.
• Si n = m et p = q, on pose C = (cij ) = A ⊕ B la matrice somme de A et B avec cij = aij ⊕ bij .
n
M
• Si p = m, on pose D = (dij ) = A B, 1 6 i 6 n, 1 6 k 6 q la matrice produit de A et B avec dij = aik bkj
k=1

2 Matrice d’adjacence, chemin, clôture transitive


On considère un graphe G ayant n et soit A sa matrice d’adjacence (qui est carrée). On note A(2) = A A.
(2)
Lemme Pour tout i 6= j on a aij = 1 si et seulement si, il existe un chemin de longueur 2 entre les sommets d’indice
i et d’indice j passant par un certain sommet d’indice k.
Km
(m)
Par suite note A = A. On a alors
1
(m)
Proposition Pour tout i 6= j on a aij = 1 si et seulement si, il existe un chemin de longueur m entre les sommets
d’indice i et d’indice j.
Définition Soit G un graphe orienté. La clôture transitive de G est le graphe orienté G0 ayant les mêmes sommets
de G et comme arrête i → j s’il existe un chemin du sommet d’indice i vers le sommet d’indice j dans G.
n−1
M
Proposition Soit A la matrice d’adjacence d’un graphe orienté G ayant n sommet. On pose Ā = A(k) . Alors Ā
k=1
est la matrice d’adjacence de la clôture transitive de G0 de G.

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

Sa matrice d’ajacence est  


0 0 1 0
 1 0 0 0 
A=
 
0 1 0 0 
0 1 1 0

Étape 0 : On pose B = A donc  


0 0 1 0
 1 0 0 0 
B=
 0

1 0 0 
0 1 1 0

É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

Étape 2 : On cherche les configuration bj2 et b2k , j 6= k, j, k 6= 2. Ici on trouve


• 3 → 2 → 1, on pose donc b31 = 1;
• 4 → 2 → 1, on pose donc b41 = 1;
• 4 → 2 → 3, on pose donc b43 = 1 (pas de changement, on avait déjà b43 1).
 
0 0 1 0
 1 0 1 0 
B=  1 1 0 0 

1 1 1 0

Étape 3 : On cherche les configuration bj3 et b3k , j 6= k, j, k 6= 3. Ici on trouve


• 1 → 3 → 2, on pose donc b12 = 1;
• → 3 → 1, on pose donc b21 = 1;
• 4 → 3 → 1, on pose donc b41 = 1;
• 4 → 3 → 2, on pose donc b42 = 1.
(Les 3 derniers existent déjà)
 
0 1 1 0
 1 0 1 0 
B=
 1

1 0 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

1.1. Dessiner la clôture transitive de ce graphe


1.2. Donner la matrice A d’adjacence de ce graphe et calculer à partir de celle ci la clôture transitive du graphe (ie
calculer Ā en utilisant les puissances de A en tant que matrice à coefficient dans l’algèbre de Booole sur {0, 1}).
1.3. Pour chaque étape de l’algorithme de Warshall écrire la matrice obtenue.

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.

Vous aimerez peut-être aussi