• Aucun résultat trouvé

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; }