6.4.1 Rappels sur les relations binaires
Soit E un ensemble fini, n = |E|, et R une relation binaire (c’est-`a-dire une partie de E ×E). Pour un ´el´ement {(x, y)} ∈ R on ´ecrira aussi x R y. On d´efinit par r´ecurrence l’´el´evation `a la puissance Ri : � � � � R i = R · Ri−1 R0 = id Par exemple, R2 = { (x, z) / ∃y , xRy ∧ yRz}.
Lemme 7. ∃ p, q/ 0 ≤ p < q ≤ 2(n2)
tq Rp = Rq
D´emonstration. Il y a autant de relations binaires que de parties de E×E. Comme |E×E| = n2,
il y a exactement 2(n2)
relations binaires.
D´efinition 7. - Soit S est une relation binaire ; on dit que S est transitive ⇔ S2 ⊆ S.
- Soit R est une relation binaire ; on d´efinit la fermeture transitive R+ par :
R+= �
n S⊇R Stransitive
S
Remarque 1. – il existe au moins une relation transitive S contenant R (notamment ∀x, y, xSy).
– l’intersection de deux relations transitives est transitive. Proposition 2. xR+y ⇔
∃p > 0 | ∃x1. . . xp ∈ E avec x1= x, xp= y et xiRxi+1 pour 1 ≤ i ≤ p
ce qui peut aussi s’´ecrire : R+ = � p≥1
Rp
D´emonstration. Nommons xCy la relation chemin de R. Montrons que C = R+ :
– R+ ⊆ C : C contient R et C est transitive, donc C est un des termes de l’intersection
dans la d´efinition de R+.
– C ⊆ R+ : fixons un chemin de x `a y, et soit S transitive et contenant R. Comme S
contient R, S doit contenir tous les arcs du chemin consid´er´e ; et comme S est transitive, S doit contenir le couple (x, y). Maintenant R+ est l’intersection de tels relations S, donc (x, y) est dans R+. Proposition 3. (1) Rn⊆ � 0≤i≤n−1 Ri et (2) ∀p ≥ 1, Rp ⊆ � 1≤i≤n Ri
D´emonstration. 1. Soit S = �0≤i≤n−1Ri et supposons aRnb, on va montrer qu’alors aSb.
Il existe x0, . . . , xn ∈ E, x0 = a, xn = b, xiRxi+1 pour 0 ≤, i < n. On a n + 1 valeurs
de x donc il existe p et q tels que xp = xq, avec 0 ≤ p < q ≤ n. Si p = 0 et q = n,
alors a = b donc aR0b donc aSb. Sinon, on a aRpx
p = xq = Rn−qxn, donc aRsb avec
s = n + p− q ≤ n − 1, et aSb. 2. Par r´ecurrence sur p :
– p = 1 : R1⊆�
1≤i≤nRi
– p → p + 1 :
on vient de montrer que Rn⊆�
0≤i≤n−1Ri, donc �0≤i≤nRi
�
0≤i≤n−1Ri
si par hypoth`ese de r´ecurrence Rp ⊆�
1≤i≤nRi ⊆
�
0≤i≤n−1Ri,
alors en composant par R on a Rp+1⊆�
1≤i≤nRi
D´efinition 8. Fermeture reflexive et transitive : R∗= Id ∪ R+ = �
0≤i≤n−1
Ri
6.4.2 Chemins dans les graphes
– Soit M la matrice d’adjacence de G = (V, E). On consid`ere ses coefficients comme des entiers.
– Lemme : soit Mp la puissance p-`eme de M. Le coefficient Mp
ij est ´egal au nombre de
chemins de longueur p de vi `a vj
– Preuve par r´ecurrence :
– Vrai par d´efinition pour p = 1 – Mp
ij = �nk=1M p−1
ik .Mkj, cette relation exprime toutes les d´ecompositions possibles d’un
chemin de longueur p en un chemin de longueur p − 1 suivi d’une derni`ere arˆete – Notons que si on consid`ere les coefficients de M comme des bool´eens, Mpdonne l’existence
d’un chemin de longueur p (cf. ce qui pr´ec`ede).
6.4.3 Fermeture transitive
Algorithme na¨ıf
– G+= (V, A+) d´efini par
(i, j) ∈ A+⇔ il y a un chemin non vide de v
i `a vj dans G
– M+ = M + M2+ . . . + Mn est la fermeture transitive
– M∗ = I + M+ est la fermeture r´eflexive et transitive
– Coˆut de calcul de M+ en O(n4) car on doit faire n multiplications de matrices
– Coˆut de calcul de M∗ en O(n3log n) car on peut calculer “plus” : �log n� ´el´evations
successives au carr´e de I + M (c’est l’algorithme d’exponentiation binaire vu Section 1.3) Algorithme de Roy-Warshall L’algorithme de Roy-Warshall r´esout le probl`eme de fer- meture transitive d’un graphe. Au passage, ce probl`eme est clairement un sous-probl`eme du probl`eme de plus court chemin. Il suffit pour le montrer de prendre tous les poids des arˆetes ´egaux `a 0. Dans une telle situation, δ(u, v) vaut 0 s’il existe un chemin entre u et v, et vaut +∞ dans le cas contraire. C’est ce qui permetttra d’´etendre facilement l’algorithme pour traiter des plus courts chemins dan sun graphe sans cycle de poids n´egatif.
Proposition 4. La r´ecurrence A(p) ij = A (p−1) ij + A (p−1) ip A (p−1)
pj initialis´ee avec A(0)= M, calcule
M+= A(n).
D´emonstration. La preuve est fond´ee sur l’id´ee que A(p)
ij = 1 si et seulement s’il existe un chemin
de i `a j dont tous les sommets interm´ediaires sont de num´ero inf´erieur ou ´egal `a p. Ce qui se d´emontre par r´ecurrence sur p.
– Initialisation p = 0 : on n’utilise aucun sommet interm´ediaire, donc les chemins sont r´eduits aux arˆetes du graphe, et on a bien pos´e A(0) = M.
– Le premier sens de l’´equivalence est v´erifi´e par construction. Si A(p)
ij = 1, alors on a
au moins une des ´egalit´es A(p−1)
ij = 1 ou A(p−1)ip A(p−1)pj = 1, qui traduisent toutes deux
l’existence d’un chemin de longueur inf´erieure ou ´egale `a p, entre i et j, par hypoth`ese de r´ecurrence.
– Pour la r´eciproque, prenons un chemin de i `a j de longueur inf´erieure ou ´egale `a p, et montrons que A(p)
ij = 1 :
– Si ce chemin passe par le sommet p, on a i� p � j, avec i � p et p � i ´etant deux chemins dont tous les sommets interm´ediaires sont de num´ero strictement inf´erieur `a p. Par hypoth`ese de r´ecurrence, A(p−1)
ip = 1 et A(p−1)pj = 1.
– Si ce chemin ne passe pas par le sommet p, tous les sommets interm´ediaires de ce chemin sont de num´ero strictement inf´erieur `a p, et par hypoth`ese de r´ecurrence, A(p−1)
ij = 1. Algorithme de Roy-Warshall d´ebut A← M; pour p de 1 `a n faire pour i de 1 `a n faire pour j de 1 `a n faire Aij ← Aij + AipApj; fin fin fin fin
Cet algorithme s’effectue en place, c’est-`a-dire que l’on travaille sur une seule matrice A pour calculer successivement les A(p). Il y a deux mani`eres de justifier cela.
La premi`ere consiste `a dire que la matrice A ne fait que croˆıtre (on n’enl`eve pas de 1), et que donc `a la fin de l’algorithme A(n) ⊇ M+, et comme par construction on v´erifie toujours
A⊆ M+, on a bien A = M+ `a la fin.
La seconde justification s’appuie sur une r´e´ecriture de l’algorithme :
Pour montrer l’´equivalence des deux algorithmes, on discute selon la valeur de Aip. Premier
cas : Aip = 1. On fait alors Aij ← Aij + Apj pour tout j. Lorsque j = p, on ne change pas
Aip qui vaut d´ej`a 1. Second cas : Aip = 0. Il n’y a alors aucune modification de faite sur A :
Aij ← Aij+ 0Apj, et ce mˆeme lorsque j = p.
L’algorithme de Roy-Warshall est en O(n3). Pour calculer la fermeture r´eflexive, on part de
A(0) = M, mais pour la fermeture r´eflexive et transitive, on part de A(0) = I + M.
Impl´ementation
static void multiplier (int c[][], int a[][], int b[][]) { int n = c.length;
for (int i = 0; i < n; ++i)
d´ebut A← M; pour p de 1 `a n faire pour i de 1 `a n faire si Aip alors pour j de 1 `a n faire si Apj alors Aij ← 1; fin fin fin fin fin fin c[i][j] = 0; for (int k = 0; k < n; ++k)
c[i][j] = c[i][j] + a[i][k] * b[k][j]; }
}
static void additionner (int c[][], int a[][], int b[][]) { int n = c.length;
for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j)
c[i][j] = a[i][j] * b[i][j]; }
static boolean existeChemin (int i, int j, GrapheMat g) { int n = g.nb;
int m[][] = g.m;
int u[][] = (int[][]) m.clone(); int v[][] = new int[n][n];
for (int k = 1; u[i][j] == 0 && k <= n; ++k) { multiplier (v, u, m);
additionner (u, u, v); }
return u[i][j] != 0; }
static public void fermetureTransitive(GrapheMat g) { for (int k = 0; k < g.nb; ++k)
for (int i = 0; i < g.nb; ++i) if (g.m[i][k] == 1)
for (int j = 0; j < g.nb; ++j) if (g.m[k][j] == 1)
g.m[i][j] = 1; }
for (int i = 0; i < g.nb; ++i) g.m[i][i] = 1;
for (int k = 0; k < g.nb; ++k) for (int i = 0; i < g.nb; ++i)
if (g.m[i][k] == 1)
for (int j = 0; j < g.nb; ++j) if (g.m[k][j] == 1)
g.m[i][j] = 1; }