Académique Documents
Professionnel Documents
Culture Documents
František Kardoš
frantisek.kardos@u-bordeaux.fr
Parcours en profondeur
Algorithme 1 : PP(G)
Données : graphe G Algorithme 2 : Visiter(u)
1 début 13 début
2 pour chaque s sommet de G 14 couleur[u] ← GRIS ;
faire 15 d[u] ← temps ← temps + 1 ;
3 couleur[s] ← BLANC ; 16 pour chaque v voisin (sortant)
4 π[s] ← NULL ; de u faire
5 fin 17 si couleur[v ] = BLANC
6 temps ← 0 ; alors
7 pour chaque s sommet de G 18 π[v ] ← u ;
faire 19 Visiter(v ) ;
8 si couleur[s] = BLANC 20 fin
alors 21 fin
9 Visiter(s) ; 22 couleur[u] ← NOIR ;
10 fin 23 f [u] ← temps ← temps + 1 ;
11 fin 24 fin
12 fin
Parcours en profondeur – graphes orientés
A E
arcs de liaison
B F
C G
arcs transverses
D
Parcours en profondeur – graphes orientés
A E
arcs de liaison
B F
arcs de retour
arcs d’avant
C G
arcs transverses
D
Parcours en profondeur – graphes orientés
A E
arcs de liaison
B F
arcs de retour
arcs d’avant
C G
arcs transverses
D
Parcours en profondeur – graphes orientés
A E
arcs de liaison
B F
arcs de retour
arcs d’avant
C G
arcs transverses
D
Parcours en profondeur – graphes orientés
A E
arcs de liaison
B F
arcs de retour
arcs d’avant
C G
arcs transverses
D
Parcours en profondeur : Applications
B E
C F
D G
A E F G B C D
Définitions
B F
C G
D
Définitions
B F
C G
D
Quelques observations
Vrai ou faux ?
▶ Soit uv un arc d’une composante fortement connexe. Alors
il existe un chemin de v à u.
Quelques observations
Vrai ou faux ?
▶ Soit uv un arc d’une composante fortement connexe. Alors
il existe un chemin de v à u.
▶ Soit uv un arc d’une composante fortement connexe. Alors
uv est contenu dans un circuit.
Quelques observations
Vrai ou faux ?
▶ Soit uv un arc d’une composante fortement connexe. Alors
il existe un chemin de v à u.
▶ Soit uv un arc d’une composante fortement connexe. Alors
uv est contenu dans un circuit.
▶ Soit u et v deux sommets d’un graphe orienté. Si u et v
appartiennent au même circuit, alors u et v sont dans la
même composante fortement connexe.
Quelques observations
Vrai ou faux ?
▶ Soit uv un arc d’une composante fortement connexe. Alors
il existe un chemin de v à u.
▶ Soit uv un arc d’une composante fortement connexe. Alors
uv est contenu dans un circuit.
▶ Soit u et v deux sommets d’un graphe orienté. Si u et v
appartiennent au même circuit, alors u et v sont dans la
même composante fortement connexe.
▶ Soit u et v deux sommets d’un graphe orienté. Si u et v
sont dans la même composante fortement connexe, alors
u et v appartiennent au même circuit.
Quelques observations
Vrai ou faux ?
▶ Soit uv un arc d’une composante fortement connexe. Alors
il existe un chemin de v à u.
▶ Soit uv un arc d’une composante fortement connexe. Alors
uv est contenu dans un circuit.
▶ Soit u et v deux sommets d’un graphe orienté. Si u et v
appartiennent au même circuit, alors u et v sont dans la
même composante fortement connexe.
▶ Soit u et v deux sommets d’un graphe orienté. Si u et v
sont dans la même composante fortement connexe, alors
u et v appartiennent au même circuit. FAUX !
Calcul de composantes fortement connexes
Lemme
Soit G un graphe orienté, soit C un circuit dans G. Soit G/C le
graphe obtenu en réduisant C en un seul sommet, disons c.
Alors G/C a autant de composantes connexes que G, en plus,
▶ Si une composante X ne couvre pas C, alors X est une
composante de G/C ;
▶ Si X est une composante couvrant C, alors X \ V (C) ∪ {c}
est une composante de G/C.
d(x) = min{d(u) : u ∈ X },
alors
f (x) = max{f (u) : u ∈ X }.
Parcours en profondeur et CFC
A : B, G
B:E
C:
D:F
E : D, G
F :E
G : B, C
Algorithme de Kosaraju – complexité
Algorithme 1 : DFS(G)
Données : graphe G Algorithme 2 : Visiter(u)
1 début 13 début
2 pour chaque s sommet de G 14 couleur[u] ← GRIS ;
faire 15 d[u] ← temps ← temps + 1 ;
3 couleur[s] ← BLANC ; 16 pour chaque v voisin de u
4 π[s] ← NULL ; faire
5 fin 17 si couleur[v ] = BLANC
6 temps ← 0 ; alors
7 pour chaque s sommet de G 18 π[v ] ← u ;
faire 19 Visiter(v ) ;
8 si couleur[s] = BLANC 20 fin
alors 21 fin
9 Visiter(s) ; 22 couleur[u] ← NOIR ;
10 fin 23 f [u] ← temps ← temps + 1 ;
11 fin 24 fin
12 fin
Algorithme de Tarjan – implémentation
Algorithme 2 : Visiter(u)
Algorithme 1 : DFS(G) 13 début
14 couleur[u] ← GRIS ;
Données : graphe G
15 d[u] ← temps ← temps + 1 ;
1 début
16 t[u] ← d[u] ;
2 pour chaque s sommet de G
17 pour chaque v voisin de u
faire
faire
3 couleur[s] ← BLANC ;
18 si couleur[v ] = BLANC
4 π[s] ← NULL ;
alors
5 fin
19 π[v ] ← u ;
6 temps ← 0 ;
20 Visiter(v ) ;
7 pour chaque s sommet de G
21 t[u] ← min(t[u], t[v ]);
faire
22 fin
8 si couleur[s] = BLANC
23 si couleur[v ] = GRIS alors
alors
24 t[u] ← min(t[u], d[v ]);
9 Visiter(s) ;
25 fin
10 fin
26 fin
11 fin
27 couleur[u] ← NOIR ;
12 fin
28 f [u] ← temps ← temps + 1 ;
29 fin
Algorithme de Tarjan – implémentation
Algorithme 2 : Visiter(u)
15 début
Algorithme 1 : DFS(G)
16 couleur[u] ← GRIS ;
Données : graphe G 17 d[u] ← temps ← temps + 1 ;
1 début 18 t[u] ← d[u] ;
2 pour chaque s sommet de G 19 L.append(u) ;
faire 20 pour chaque v voisin de u faire
21 si couleur[v ] = BLANC alors
3 couleur[s] ← BLANC ;
22 π[v ] ← u ;
4 π[s] ← NULL ; 23 Visiter(v ) ;
5 fin 24 t[u] ← min(t[u], t[v ]);
6 temps ← 0 ; 25 fin
7 CFC ← [ ] ; 26 sinon
8 L ← [] ; 27 si v in L alors
9 pour chaque s sommet de G 28 t[u] ← min(t[u], d[v ]);
29 fin
faire
30 fin
10 si couleur[s] = BLANC
31 fin
alors 32 couleur[u] ← NOIR ;
11 Visiter(s) ; 33 f [u] ← temps ← temps + 1 ;
12 fin 34 si t[u] = d[u] alors
13 fin 35 CFC.append(L[u : ]);
14 fin 36 L ← L[ : u];
37 fin
38 fin
Algorithme de Tarjan – exemple