$$ \gdef\block#1#2#3#4#5{ \begin{aligned} &\texttt{#1 } #4 \texttt{ #2} \\ &\enspace \left#3 \enspace \begin{aligned} #5 \end{aligned} \right. \end{aligned} } \gdef\if#1#2{\block{si}{alors}{|}{#1}{#2}} \gdef\eif#1#2{\block{si}{alors}{\lfloor}{#1}{#2}} \gdef\elif#1#2{\block{sinon si}{alors}{|}{#1}{#2}} \gdef\eelif#1#2{\block{sinon si}{alors}{\lfloor}{#1}{#2}} \gdef\else#1{\block{sinon}{}{\lfloor}{}{#1}} \gdef\for#1#2{\block{pour}{faire}{\lfloor}{#1}{#2}} \gdef\foreach#1#2{\block{pour tout}{faire}{\lfloor}{#1}{#2}} $$

TD AAIA

Cours Sujet

Exercice 4

L’algorithme de Kosaraju décrit ci-dessous permet de rechercher les composantes fortement connexes (CFC) d’un graphe orienté.

Exécutez cet algorithme sur le graphe ci-dessous en détaillant les étapes de la résolution.

Pour nous convaincre de la correction de cet algorithme, nous introduisons le graphe des composantes fortement connexes $g^{cfc}=(S^{cfc}, A^{cfc})$ tel que $S^{cfc}$ est une partition de $S$ telle que :

  • chaque sommet de $S^{cfc}$ contient tous les sommets de $S$ appartenant à une $CFC$ différente ;
  • les arcs de $g^{cfc}$ traduisent l’existence de chemins entre les sommets des $CFC$ :

$$A^{cfc} = \{ (cfc_i, cfc_j) \in S^{cfc} \times S^{cfc} \mid \exists{\lang s_1, …, s_k \rang} \text{ tel que } s_1 \in cfc_i, s_k \in cfc_j \}$$

Ce graphe peut-il avoir des circuits ? Dessinez $g^{cfc}$ pour le graphe précédent. Montrez qu’après l’exécution de la ligne 3 de l’algorithme, pour tout $arc(cfc_i,cfc_j) \in A^{cfc}$, la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_i$ est supérieure à la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_j$. Autrement dit, $$max\{num[s_i]|s_i \in cfc_i\} > max\{num[s_j]|s_j \in cfc_j\}$$

En déduire des propriétés sur les couleurs des sommets au moment de l’appel à $DFS_{rec}(g^t, s_i)$(ligne 9 de l’algorithme) :

  • Peut-il y avoir des sommets gris ?
  • Que peut-on dire des sommets noirs ?
  • Que peut-on dire des sommets blancs ?

En déduire que l’algorithme est correct.


Question 1

Résolution

// Loading

$$ Blancs = \{A, B, C, D, E, F, G, H, I\} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 1
// Loading

$$ Blancs = \{ A, B, C, D, E, G, H, I \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 2
// Loading

$$ Blancs = \{ A, B, C, D, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 3
// Loading

$$ Blancs = \{ A, B, C, D, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 4
// Loading

$$ Blancs = \{ A, B, C, D, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 5
// Loading

$$ Blancs = \{ A, B, C, D, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 6
// Loading

$$ Blancs = \{ A, B, C, D, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 7
// Loading

$$ Blancs = \{ B, C, D, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 8
// Loading

$$ Blancs = \{ C, D, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 9
// Loading

$$ Blancs = \{ C, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 10
// Loading

$$ Blancs = \{ C, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 11
// Loading

$$ Blancs = \{ C, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 12
// Loading

$$ Blancs = \{ C, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 13
// Loading

$$ Blancs = \{ C, E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 14
// Loading

$$ Blancs = \{ E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 15
// Loading

$$ Blancs = \{ E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 16
// Loading

$$ Blancs = \{ E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 17
// Loading

$$ Blancs = \{ E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 18
// Loading

$$ Blancs = \{ E, G, H \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 19
// Loading

$$ Blancs = \{ E, G \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 20
// Loading

$$ Blancs = \{ E \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 21
// Loading

$$ Blancs = \{ E \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 22
// Loading

$$ Blancs = \{ E \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 23
// Loading

$$ Blancs = \{ E \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 24
// Loading

$$ Blancs = \{ E \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 25
// Loading

$$ Blancs = \{ \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 26
// Loading

$$ Blancs = \{ \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Étape 27
// Loading

$$ Blancs = \{ \} $$

ABCDEFGHI
Ordre $DFS_{num}$715629348

Question 2

Le graphe $G^{cfc}$ peut-il avoir des circuits ?

Ce graphe des SCC est un DAG. En effet, s’il existait un circuit alors, tous les sommets des SCC du circuit devraient appartenir à une même SCC. Sur notre exemple, le DAG des SCC comporte 4 sommets et 4 arcs :

$$ S^{SCC} = \{ scc_1 = \{ a, b, c, d \}, scc_2 = \{ g, h \}, scc_3 = \{ f, i \}, scc_4 = \{ e \} \} $$ $$ A^{SCC} = \{ (scc_1, scc_2), (scc_2, scc_4), (scc_3, scc_2), (scc_3, scc4) \} $$


Question 2

Montrez qu’après l’exécution de la ligne 3 de l’algorithme, pour tout $arc(cfc_i,cfc_j) \in A^{cfc}$, la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_i$ est supérieure à la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_j$. Autrement dit, $$max\{num[s_i]|s_i \in cfc_i\} > max\{num[s_j]|s_j \in cfc_j\}$$


Question 2

Montrez qu’après l’exécution de la ligne 3 de l’algorithme, pour tout $arc(cfc_i,cfc_j) \in A^{cfc}$, la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_i$ est supérieure à la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_j$. Autrement dit, $$max\{num[s_i]|s_i \in cfc_i\} > max\{num[s_j]|s_j \in cfc_j\}$$

Soit $s_0$ le premier sommet de $scc_i \cup scc_j$ qui est colorié en gris.


Question 2

Montrez qu’après l’exécution de la ligne 3 de l’algorithme, pour tout $arc(cfc_i,cfc_j) \in A^{cfc}$, la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_i$ est supérieure à la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_j$. Autrement dit, $$max\{num[s_i]|s_i \in cfc_i\} > max\{num[s_j]|s_j \in cfc_j\}$$

Soit $s_0$ le premier sommet de $scc_i \cup scc_j$ qui est colorié en gris.

  • Cas 1 : $s_0 \in scc_i$. Quand $s_0$ est découvert et colorié en gris, tous les autres sommets de $scc_i \cup scc_j$ sont blancs et sont accessibles à partir de $s_0$. Dans ce cas, le dernier sommet de $scc_i \cup scc_j$ à être colorié en noir sera $s_0$ de sorte que $num[s_0] = max\{num[s_i]|s_i \in scc_i\} > max\{num[s_j]|s_j \in scc_j\}$.

C’est le cas par exemple pour l’arc $(scc_1,scc_2)$: le premier sommet à être découvert est $a$, qui a bien la plus grande valeur de num parmi tous les sommets de $scc_1 \cup scc_2$.


Question 2

Montrez qu’après l’exécution de la ligne 3 de l’algorithme, pour tout $arc(cfc_i,cfc_j) \in A^{cfc}$, la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_i$ est supérieure à la plus grande valeur de $num$ de l’ensemble des sommets de $cfc_j$. Autrement dit, $$max\{num[s_i]|s_i \in cfc_i\} > max\{num[s_j]|s_j \in cfc_j\}$$

Soit $s_0$ le premier sommet de $scc_i \cup scc_j$ qui est colorié en gris.

  • Cas 1 : $s_0 \in scc_i$. Quand $s_0$ est découvert et colorié en gris, tous les autres sommets de $scc_i \cup scc_j$ sont blancs et sont accessibles à partir de $s_0$. Dans ce cas, le dernier sommet de $scc_i \cup scc_j$ à être colorié en noir sera $s_0$ de sorte que $num[s_0] = max\{num[s_i]|s_i \in scc_i\} > max\{num[s_j]|s_j \in scc_j\}$.

C’est le cas par exemple pour l’arc $(scc_1,scc_2)$: le premier sommet à être découvert est $a$, qui a bien la plus grande valeur de num parmi tous les sommets de $scc_1 \cup scc_2$.

  • Cas 2 : $s_0 \in scc_j$. Comme il n’existe pas d’arc allant d’un sommet de $scc_j$ vers un sommet de $scc_i$, tous les sommets de $scc_j$ seront coloriés en noir avant que le premier sommet de $scc_i$ ne soit découvert et, par conséquent, toutes les valeurs de num des sommets de $scc_j$ seront inférieures à toutes les valeurs de num des sommets de $scc_i$.

C’est le cas par exemple pour l’arc $(scc_3,scc_4)$ : le premier sommet à être découvert est $e$, qui a une valeur de num égale à 2, et tous les sommets de $scc_3$ ont une valeur de num supérieure à 2.


Question 2 - Suite

Notons finalement que le graphe transposé $g^t$ a les mêmes SCC que $g$. Par conséquent, nous pouvons rechercher les SCC dans $g^t$. En triant les sommets par ordre de num décroissant, nous sommes sûrs que pour tout arc $(scc_i,scc_j) \in A^{scc}$, un sommet de $scc_i$ sera rencontré avant un sommet de $scc_j$. Le parcours en profondeur à partir de ce premier sommet $s_i$ de $scc_i$ (ligne 9 de l’algorithme 8) permettra de découvrir tous les sommets de $scc_i$ et uniquement les sommets de $scc_i$. En effet, à l’appel de $DFS_{rec}(g^t,s_i)$ :

— tous les sommets appartenant à une SCC $scc_j$ telle qu’il existe dans $g^t$ un chemin de $s_i$ vers un sommet de $scc_j$ seront noirs (car au moins un sommet de $scc_j$ aura été rencontré avant $s_i$ dans la boucle lignes 6 à 9) ;

— tous les sommets appartenant à $scc_i$ seront blancs car tous les appels précédents à $DFS_{rec}$ seront partis de sommets pour lesquels il n’existe pas de chemin jusque $s_i$.

Auteurs

Christine Solnon