Probleme – Kosaraju : pourquoi le second parcours ne déborde pas
Exercice · niveau 3 (difficile) · informatique (MP2I/MPI), chapitre 24 — Composantes fortement connexes et couplages
Énoncé
Le chapitre admet l'essentiel de la correction. On la démontre ici.
Pour une composante , on note le maximum des dates de fin de traitement de ses sommets lors du premier parcours.
- Montrer que si le quotient a un arc , alors .
- En déduire que le sommet de plus grande date de fin appartient à une composante source.
- Conclure par récurrence que l'algorithme est correct.
- Quelle est la complexité, et que rend-on de plus ?
Corrigé
1. Soit un arc dans le quotient. Deux cas, selon celle des deux composantes que le parcours rencontre en premier.
Cas 1 : le parcours entre d'abord dans , en un sommet . Comme , tous les sommets de sont accessibles depuis ; comme aucun d'eux n'a encore été vu, la descente depuis les visitera tous et les terminera avant de terminer — c'est la propriété d'imbrication des appels récursifs. Donc .
Cas 2 : le parcours entre d'abord dans , en un sommet . Alors aucun sommet de n'est accessible depuis : sinon il y aurait un chemin de vers , et avec l'arc un cycle dans le quotient, qui est acyclique. La descente depuis termine donc tous les sommets de sans toucher à , et car sera visitée plus tard.
Dans les deux cas . Autrement dit, trier les composantes par décroissant est un tri topologique du quotient — c'est la propriété mesurée à l'exercice « Dérouler Kosaraju ».
2. Soit le sommet de plus grande date de fin, et sa composante ; alors est maximal. S'il existait un arc dans le quotient, on aurait par la question 1, ce qui contredit la maximalité. Donc n'a aucun arc entrant : c'est une source du quotient.
3. La récurrence. Le second parcours démarre en , dans . Par l'exercice « Le transposé garde les composantes », est une source de , donc un puits de : aucun arc de ne sort de . Le parcours depuis dans atteint donc exactement — il atteint tout car est fortement connexe, et rien de plus car il ne peut pas en sortir.
On marque et on recommence. Le sommet non marqué de plus grande date de fin est, par le même argument appliqué au quotient privé des composantes déjà traitées, dans une source de ce quotient réduit. La récurrence porte sur le nombre de composantes restantes, et le cas de base est le quotient vide.
4. Complexité. Trois passes linéaires : le premier parcours en , la transposition en , le second parcours en . Total , avec un espace pour le graphe transposé.
Et l'on rend plus que les composantes. La numérotation produite est un tri topologique du quotient (question 1), vérifié sur graphes aléatoires sans un seul arc à contresens. C'est ce supplément gratuit qui rend la décomposition utile : il permet de traiter les composantes dans un ordre où toute composante vient après celles dont elle dépend. C'est ce dont la programmation dynamique a besoin, et c'est ce dont le problème suivant se sert.
Une remarque sur la pile. Le code du chapitre est récursif ; sur un graphe de sommets formant un long chemin, la pile d'appels déborde. Une version itérative avec pile explicite est nécessaire en pratique — c'est le même arbitrage qu'à l'exercice « Compresser sans récursion » du chapitre chap:unir.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.