TD d’algorithmique avancée

Algorithm, Graph Theory · lab

Voir tous les documents en programmation

TD d’algorithmique avancée

Corrigé du TD 9 : Tri topologique

Jean-Michel Dischler et Frédéric Vivien

Un tri topologique d’un graphe orienté acyclique G = (S, A) est un ordre linéaire des sommets de G

tel que si G contient l’arc (u, v), u apparaˆıt avant v. Le tri topologique d’un graphe peut être vu comme un

alignement de ses sommets le long d’une ligne horizontale tel que tous les arcs soient orientés de gauche à

droite.

Attention : le tri topologique d’un graphe orienté acyclique n’est pas forcément unique.

1. Proposez un tri topologique du graphe de la figure 1.

1

2

3

9

8

7

4

5

6

7

9

1

4

2

5

8

3

6

9

4

5

1

2

Publicité

3

6

8

7

7

4

5

9

1

2

8

3

6

Fig. 1 – Exemple de graphe orienté acyclique avec trois de ses tris topologiques possibles.

2. Modifiez l’algorithme de parcours en profondeur vu en cours pour qu’il calcule pour chaque nœud u sa

date de fin de traitement fin[u] (la date à laquelle lui et ses fils ont été traités).

PP(G)

pour chaque sommet u de G faire couleur [u] ← Blanc

pour chaque sommet u de G faire si couleur [u] = Blanc alors Visiter-PP(G, u, couleur )

Visiter-PP(G, s, couleur )

couleur [s] ← Gris

pour chaque voisin v de s faire

si couleur [v] = Blanc alors Visiter-PP(G, v, couleur )

couleur [s] ← Noir

temps ← temps + 1

fin[s] ← temps

3. Quel lien pouvez-vous faire entre les dates de fin de traitement et un tri topologique ?

Si le graphe G contient l’arc (u, v), le traitement de u finira après le traitement de v, et on aura donc

fin[u] > fin[v]. Trier les sommets par date de fin de traitements décroissantes nous fournit donc un tri

topologique du graphe. La figure 2 présente le graphe de la figure 1 où les nœuds ont été annotés avec

des fins de date de traitement lors d’un parcours en profondeur (¡¡ racines ¿¿ successives : nœuds 1, 9,

4 et 7). On retrouve alors le troisième des tris topologiques de la figure 1.

Publicité

1

5

4

2

1

2

3

6

3

9

9

8

7

8

7

1

4

5

6

Fig. 2 – Graphe annoté par les dates de fin de traitement d’un parcours en profondeur.

4. Proposez un algorithme de tri topologique. Quel est sa complexité ?

On commence par parcourir le graphe en profondeur avec l’algorithme de la question 2, puis on trie les

sommets par date de fin décroissante. La complexité de l’ensemble est donc celle du parcours O(|S|+|A|)

plus celle du tri O(|S| log(|S|)), soit O(|S| log(|S|) + |A|).

5. Améliorez votre algorithme pour qu’il soit de complexité linéaire.

PP(G)

Soit P une pile initialement vide

pour chaque sommet u de G faire couleur [u] ← Blanc

pour chaque sommet u de G faire si couleur [u] = Blanc alors Visiter-PP(G, u, couleur , P )

tant que non Pile-Vide(P ) faire

u ← Dépiler(P )

Afficher(u)

Publicité

Visiter-PP(G, s, couleur , P )

couleur [s] ← Gris

pour chaque voisin v de s faire

si couleur [v] = Blanc alors Visiter-PP(G, v, couleur , P )

couleur [s] ← Noir

Empiler(P ,s)

On stocke dans une pile les éléments dans l’ordre dans lequel leur traitement se termine. On retirera

les éléments de la pile dans l’ordre inverse de celui dans lequel ils ont été insérés (une pile fonctionne

toujours sur le mode ¡¡ premier entré, dernier sorti ¿¿). Utiliser une pile plutôt que simplement les

dates de fin de traitement nous évite d’avoir à trier ces dates (ce qui nous coûterait O(|S| log(|S|)).

L’algorithme complet a ici un coût de O(|S|+|A|) (le parcours est de coût O(|S|+|A|) et la pile contient

|S| éléments, donc les dépiler est de coût O(|S|)).

6. Proposez un autre algorithme de tri topologique, basé cette fois-ci sur le fait qu’un sommet de degré

entrant nul peut être placé en tête d’un tri topologique. Quelle est la complexité de cet algorithme ?

La figure 3 présente le second algorithme de tri topologique. Un sommet qui est placé dans la file, est

un sommet dont tous les prédécesseurs ont déja été ordonnés : on peut donc le placer a son tour dans

l’ordre sans risquer de violer un arc. La complexité de l’ensemble est une fois de plus en O(|S| + |A|).

2

Tri-Topologique(G = (S, A))

Soit F une file initialement vide

pour chaque sommet u de G faire

degré(u) ← degré entrant de u

si degré(u) = 0 alors Insertion(F , u)

tant que non File-Vide(F ) faire

u ← Suppression(F )

Afficher(u)

pour chaque voisin v de u faire

degré(v) ←degré(v) − 1

si degré(v) = 0 alors Insertion(F , v)

Fig. 3 – Deuxième algorithme de tri topologique.

3