Vous êtes sur la page 1sur 11

@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info

ALGORITHMES DE CONNEXITÉS
Algorithmes de connexités ....................................................................................... 2
Introduction
Introduction ............................................................................................................. 2

Détermination des Composantes Connexes d’un Graphe ......................................... 3 La vérification de la connexité d’un graphe est un des premiers problèmes
de la théorie des graphes.
Principe................................................................................................................ 3
Exemple ............................................................................................................... 3
Par exemple, on souhaite savoir si deux points (sommets, ordinateurs) sont
Algorithme ........................................................................................................... 4
reliés entre eux sans vouloir connaître comment.
Détermination des composantes fortement connexes ............................................... 6

Méthode1 : Basée sur le transposé du graphe .......................................................... 6

Rappel : Transposée (=inverse) d’un graphe ...................................................... 6 Exprimé en termes de graphes non orientés, ce problème consiste à
Principe................................................................................................................ 6 déterminer des composantes connexes : « tous les sommets d’une même
Exemple .................................................................................................................. 8
composante connexe sont mutuellement accessibles et deux sommets de
Définition : chemin Hamiltonien ...................................................................... 10 deux composantes connexes distinctes ne peuvent être joints par aucune
Remarque........................................................................................................... 10
chaîne ».
Algorithme de Détermination des Composantes Fortement Connexe............... 11
Suite de l’exemple .............................................................................................. 13
Parcours en Profondeur du Transpose de G ..................................................... 15 Dans le cas de graphes orientés, on a recours au concept de forte
Détermination des CFC par marquage ................................................................... 16 connexité.

Technique de Marquage +/- .............................................................................. 16


Exemple ............................................................................................................. 16 Un graphe G est fortement connexe si pour tous sommets s, t de G, il existe
Algorithme de Composante Fortement connexe par Marquage ....................... 17 un chemin de s vers t.
Exemple ............................................................................................................. 19

1 2
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
Détermination des Composantes Connexes d’un Graphe Algorithme

Principe Partant d’un sommet du graphe, on va numéroter les sommets dans l’ordre
d’une exploration en profondeur (ou en largeur), c’est à dire que l’on
En appliquant d’une manière répétitive un Parcours en Profondeur ou un
descendra d’abord dans le graphe le plus loin possible sans former de cycle
parcours en Largeur sur tous les sommets non encore visités.
puis on remontera jusqu’à la dernière bifurcation laissée de côté et ainsi de
Il est clair qu’une composante connexe est constituée du sous graphe dont suite jusqu’au retour au sommet de départ.
les sommets sont visités par un seul appel à Parcours en Profondeur ou
L’ensemble des sommets ainsi rencontrés forme la première composante
Parcours en Largeur.
connexe.
Autrement dit,
Si tous les sommets du graphe ont été rencontrés, le graphe est connexe.
Si l’ensemble des sommets du graphe sont explorés, alors le graphe est
Sinon, on recommence l’exploration précédente à partir d’un sommet non
connexe.
encore rencontré, d’où une seconde composante connexe, etc.
Si non, on recommence l’exploration à partir d’un sommet non encore visité,
d’où une seconde composante connexe, etc…

Exemple

2 4 5
1
7
3
6
Ce graphe est constitué de deux composantes connexes.

3 4
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
// Composantes connexes Détermination des composantes fortement connexes
Début
Deux sommets distincts appartiennent à la même composante fortement
//Initialisation
connexe si et seulement s’ils appartiennent à un même circuit.
n  nbSom(g)
Méthode1 : Basée sur le transposé du graphe
pour chaque sommet s variant de 1 à n faire
visite[s]  faux Rappel : Transposée (=inverse) d’un graphe
finPour
Soit G=(S, A) un graphe orienté.
s  1
nbSomVisite 0 Le transposé de G est obtenu en inversant le sens d’orientation des arcs.

//Traitement t
G=G-1=(S, tA) où tA={(s, t) / (t, s) ∈ A}

tantque nbsomVisite < n faire Principe

si non visite[s] alors Soit G=(S, A) un graphe orienté.


L’algorithme calcul les CFC d’un graphe G à l’aide de deux parcours en
reParcoursProfondeur(s, visite, g, nbSomVisite, …..) //A modifier
profondeur : l’un sur G et l’autre sur tG de la manière suivante :
itParcoursProfondeur(s, visite, g, nbSomVisite, …..) //A modifier

parcoursLargeur((s, visite, g, nbSomVisite, …..) //A modifier  On effectue un Parcours en profondeur sur G, en construisant une liste L
des sommets en ordre suffixe (traitement des enfants avant le père).
Restituer le sous graphe visité par un Parcours Profondeur
ou un Parcours Largeur ( une composante connexe)  On effectue ensuite un parcours en profondeur sur tG à partir du dernier
sommet de la liste L (c’est à dire le sommet ayant la numérotation la plus
fsi
élevé dans L).
s somSuivant(s, n, Visite)
Après le parcours en profondeur sur tG deux cas peuvent se présenter :
finTq
♦ Tous les sommets du graphe ont été atteints : dans ce cas, le graphe G est
Fin fortement connexe (on obtient une seule composante fortement connexe)

5 6
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
♦ Certains sommets n’ont pas été visités. On recommence l’exécution des Exemple
parcours en profondeur de tG à partir du dernier sommet non marqué de
Le graphe G :
la liste L et ainsi de suite.

Les sous graphes de G engendrés par les sommets des arborescences ainsi 1 2 3
8
obtenue lors du parcours en profondeur du tG, constituent les
composantes fortement connexes de G.
7 6 5 4

Le transposé de G est :

1 2 3
8

7 6 5 4

Parcours en profondeur de G à partir du sommet 1 est :

2 1

4 6 8

3 5 7

L=[ 5 7 6 8 1 3 4 2]

7 8
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
 On effectue un parcours en profondeur de tG en commençant par le  Le graphe réduit est donc :
sommet 2 car c’est le sommet de numéro suffixe le plus élevé dans la liste
L. 8
1 2 3

2 3 4

CFC1 = { 2, 3, 4} 7 6 5 4

Remarque : tous les sommets ne sont pas marqués.


CFC1 = {2, 3, 4} CFC2 = { 1, 5, 6, 8} CFC3 = { 7 }
t
 Donc on re-parcours en profondeur le G à partir du dernier sommet non
marqués dans L (c’est à dire le sommet 1)

CFC1 CFC2 CFC3


1 5 6 8

PP(tG ) à partir du sommet 1 : Définition : chemin Hamiltonien

CFC2 = { 1, 5, 6, 8} Un chemin hamiltonien « CH » est un chemin qui passe par tous les
sommets du graphe une seule fois.
Remarque : tous les sommets de la liste L ne sont pas marqués.
CH(G) = CH( CFC1 ) + CH( CFC2 ) + CH( CFC2 )
 Donc on re-parcours en profondeur le tG à partir du dernier sommet non
marqués dans L (c’est à dire le sommet 7) Remarque

PP(tG ) à partir du sommet 7 : Le graphe n’étant pas fortement connexe. Donc il n’admet pas de circuit
hamiltonien.
CFC3 = { 7 }

9 10
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
Algorithme de Détermination des Composantes Fortement Connexe /* Parcours en profondeur de tG */

Soit G=(S, A) un graphe. /* initialisation */

On suppose que les sommets du graphe sont numérotés de 1 à n. pour s variant de 1 à n faire

L’algorithme qui suit, associe à chaque sommet du graphe le numéro de la visite[s]  faux
C.F.C à laquelle il appartient.
fpour
CFC = est un tableau indicé par le numéro de sommets de G
CFC[i] = numéro de la CFC du sommet i nbCFC  0
nbCFC = nombre de CFC de G
procédure ComposanteFortementConnexe(G, CFC, nbCFC) nbSomVisite 0

Début sn
/* initialisation */ tantque (nbsomVisite <= n) faire
n  nbSom(g) si non visite[L[s]] alors
Pour s variant de 1 à n faire
nbCFC  nbCFC + 1
Visite[s]  faux
Fpour ParcoursProfondeurTransposeG(L[s], visite, G, CFC, nbCFC,

NbSomVisite 0 nbSomVisite)
/*Construction de la liste L des sommets en
ordre suffixe de G*/ finsi

s1 s  somSuivant(s, n, visite, L)


tantque (nbsomVisite <= n) faire
finTq
si (non Visite[s]) alors
parcoursProfondeurSuffixe(s, visite, G, L, NbSomVisite) Fin
fsi
s  somSuivant(s, n, visite)
Fintq

11 12
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
Suite de l’exemple Parcours en Profondeur en ordre Suffixe

Parcours en profondeur du graphe G à partir du sommet s et construction de


1 2 3 la liste L des sommets visité en ordre suffixe.
8

NbSomVisité = nombre de sommets déja visité

7 6 5 4 L = liste des sommets visités pendant PP(G) en ordre suffixe

procédure parcoursProfondeurSuffixe(s, visite, G, L, nbSomVisite)


CFC= 2 1 1 1 2 2 3 2 Début
Visite[s]  vrai
1 2 3 4 5 6 7 8
Pour chaque t ∈ Γ dans G faire

Numéro des sommets numéro de la CFC Si non visite[t] alors

parcoursProfondeurSuffixe(t, visite, G, L, nbSomVisite)

Finsi
CFC1 = {2, 3, 4} CFC2 = { 1, 5, 6, 8} CFC3 = { 7 }
Finpour

nbCFC = 3 nbSomVisite  nbSomVisite + 1

L[nbSomVisite]  s

Fin

13 14
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
Parcours en Profondeur du Transpose de G Détermination des CFC par marquage

Remarque Technique de Marquage +/-

Le parcours en profondeur de tG s’effectue à l’aide des prédécesseurs Marquage + = ensemble des sommets accessibles depuis s (s inclus)

des sommets de G Marquage - = ensemble des sommets depuis lesquels s est accessible (s

Parcours en profondeur du transposé de G à partir du sommet s et inclus)

remplissage du tableau CFC par la valeur numCFC Exemple

NumCFC = numéro de la iéme composante fortement connexe


+- +- - -
8 1 2 3
procédure parcoursProfondeurTransposeG (s, visite, G, CFC,

NumCFC, nbSomVisite)

Début 7 6 5 4
Visite[s]  vrai +- +- +- -

CFC[s]  NumCFC
CFC1={1, 5, 6, 8}
nbSomVisite  nbSomVisite + 1
Pour chaque t prédécesseur de s dans G faire
+- +-
Si non visite[t] alors 3
2
parcoursProfondeurTransposeG (t, visite, G, CFC,
4
NumCFC, nbSomVisite) +- CFC2={2, 3, 4}
FinSi
Finpour
+-
FIN 7
CFC3={7}

15 16
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
Algorithme de Composante Fortement connexe par Marquage /*Calcul de CFC */
Si non vide(D) et non vide (A) alors
La composante fortement connexe associé à un sommet s peut être
CFC[s]  A ∩ D
déterminée par le calcul de l’intersection de D(s) et A(s) Sinon

D(s) = représente l’ensemble des descendants de s CFC[s]  {s}


FinSi
A(s) = représente l’ensemble des ascendants de s
L’ensemble (D(s) ∩ A(s) ) correspond aux sommets qui se situent sur un
circuit contenant s.

/* Calcul de D */
D  {s} ∪ Γ(s) /* Γ(s) = Ens des successeurs directs */
Ns  D \ {s} /* Ens des nouveaux sommets atteints */
Tantque Non vide(Ns) et D≠S(G) faire
T ← ∪ Γ(t )
t ∈ Ns

Ns  T \ ( T ∩ D )
D  D ∪ Ns
Fintantque
/* Calcul de A */
A  {s} ∪ Γ-1(s) /* Γ-1(s) = Ens des Prédécesseurs directs */
Ns  A \ {s} /* Ens des nouveaux sommets atteints */
Tantque Non vide(Ns) et A≠S(G) faire
Γ
−1
T← ∪ (t )
t ∈ Ns

Ns  T \ ( T ∩ A )
A  A ∪ Ns
Fintantque

17 18
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info @Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
Exemple Exemple 2
+- +- - -
8 1 2 3
1

2 3

7 6 5 4
5 4 +- +- +- -
D  {1] U Succ(1)={1, 6, 7, 8}
8 Ns  {6, 7, 8}
7
Iter1
6
T  succ(6)Usucc(7)Usucc(8)
Sommet s 1 2 3 4 5 6 7 8 T  {5, 7, 6}
Γ(s) {2, 3} {2, 3, 4} {2, 4} {3, 6, 8} {7} {} {4, 5, 6} {} Ns  {5}

Γ -1(s) {} {1, 3} {1, 2, 4} {2, 3, 7} {7} {4, 7} {5} {4, 8} D  {1, 5, 6, 7, 8}

Γ -1(1)={} A={1} D={1} U {…} CFC1 = {1}=A=A∩D Iter 2


T  succ(5)
Γ(6)={} D={6} A={6} U {…} CFC6 = {6}=D=A∩D
T  {1}
Γ(8)={} D={8} A={8} U {…} CFC8 = {8}=D=∩D
Ns  {}
CFC2 Γ(2)={2, 3, 4} D={2, 3, 4} Ns={3, 4}
D  {1, 5, 6, 7, 8}
Γ(3)={2, 4} T={2, 3, 4, 6, 8} Ns={6, 8}
Fin d itérations
Γ(4)={3, 6, 8}

D(2)={2, 3, 4, 6, 8}

Γ -1(2)={1, 3} D={1, 2, 3} Ns={1, 3}

Γ -1(2)={} T={1, 2, 4} Ns={4}

Γ -1(3)={1, 2, 4}

A(2) = {1, 2, 3} U {4}={1, 2, 3, 4}

CFC2 =D(2) ∩ A(2) = {2, 3, 4}

19 20
@Brahim DERDOURI CM-Algos Connexités -GOC-L3-Info
+- +- - -
8 1 2 3

7 6 5 4
+- +- +- -
A {1} U pred(1)={1, 2, 5}
Ns  {2, 5}
Iter1
T  pred(2) U pred(5)
T  {3} U {4, 6} ={3, 4, 6}
Ns  {3, 4, 6}
A  {1, 2, 3, 4, 5, 6}
Iter2
T  pred(3) U pred(4) U pred(6)
T  {4}U{2}U{1, 8}={1, 2, 4, 8}
Ns  {8}
A  {1, 2, 3, 4, 5, 6, 8}
Iter 3
T  pred(8)={1}
Ns  {}
A  {1, 2, 3, 4, 5, 6, 8}
Fin d’itérations

CFC  D Inter A

= {1, 5, 6, 7, 8} inter {1, 2, 3, 4, 5, 6, 8}

CFC  {1, 5, 6, 8}

21

Vous aimerez peut-être aussi