Apprentissage interactif de la théorie des graphes
Apprentissage interactif de la théorie des graphes
Guest User
Using app without sign in
Détecteur de cycles dans le graphe
Détecte les cycles dans les graphes dirigés/non dirigés
Sélectionnez un algorithme et générez les étapes pour commencer la visualisation
La détection de cycles détermine si un graphe contient un cycle, un chemin qui revient à son sommet de départ. Les techniques diffèrent entre graphes orientés, où les cycles signifient des dépendances circulaires, et non orientés, où toute arête supplémentaire au-delà d'un arbre crée un cycle.
Dans les graphes orientés, DFS classe les arêtes : une arête de retour vers un sommet encore dans la pile de récursion prouve un cycle, suivi avec trois états de sommet (non visité, en cours, terminé). Dans les graphes non orientés, DFS trouve un cycle en rencontrant un sommet visité autre que son parent, et Union-Find en détecte un quand une arête joint deux sommets déjà dans le même ensemble. Toutes les approches s'exécutent en O(V + E), Union-Find quasi constant par arête.
La détection de cycles prévient les interblocages dans les systèmes d'exploitation, repère les imports circulaires dans les outils de build et gestionnaires de paquets, valide les tableurs et définitions de flux de travail, et garde l'entrée du tri topologique. La variante lièvre et tortue de Floyd pour les listes chaînées est l'une des questions d'entretien les plus posées.
Les graphes orientés et non orientés exigent des tests réellement différents. La version orientée suit la pile de récursion; la version non orientée suit le parent.
// Orienté: DFS à trois couleurs
BLANC = non visité, GRIS = dans la pile, NOIR = terminé
aUnCycle(u):
couleur[u] = GRIS
pour chaque voisin v de u:
si couleur[v] == GRIS: renvoyer vrai // arête arrière
si couleur[v] == BLANC et aUnCycle(v):
renvoyer vrai
couleur[u] = NOIR
renvoyer faux
// Non orienté: DFS transportant le parent
aUnCycle(u, parent):
visites.ajouter(u)
pour chaque voisin v de u:
si v == parent: continuer
si v dans visites: renvoyer vrai
si aUnCycle(v, u): renvoyer vrai
renvoyer fauxLa distinction pèse plus lourd qu'il n'y paraît. Dans un graphe orienté, atteindre un sommet NOIR correspond à une arête transverse et ne comporte aucun cycle, si bien que le test naïf des visités signale des cycles inexistants. Dans un graphe non orienté, sauter le parent est précisément ce qui empêche de lire chaque arête comme un cycle à deux sommets.
Exécute le test orienté à trois couleurs sur un graphe contenant un cycle et une arête transverse trompeuse.
Graphe d'exemple: Arêtes orientées A vers B, A vers C, B vers D, C vers D et D vers B.
Le graphe contient bien un cycle, B vers D vers B, trouvé grâce au test GRIS. Le chemin A vers C vers D n'est pas un cycle, et seule la distinction de couleurs sépare les deux cas.
Temps: O(V + E) · Espace: O(V)
Les deux variantes sont un unique DFS avec un travail supplémentaire constant par arête, le coût est donc celui du parcours. Le tableau des couleurs ou l'ensemble des visités est en O(V), plus O(V) de pile de récursion. L'alternative Union-Find pour les graphes non orientés tourne en O(E alpha(V)), pratiquement linéaire, et devient préférable quand les arêtes arrivent une à une et que tu veux rejeter l'arête fermant le cycle au moment où elle apparaît, sans reparcourir tout le graphe.
Choisis le test correspondant à la fois à l'orientation de tes arêtes et au fait que le graphe soit statique ou construit au fil de l'eau.
| Alternative | À préférer quand | Coût |
|---|---|---|
| Union-Find | Non orienté, avec des arêtes arrivant progressivement. Rejette l'arête fermant le cycle en temps quasi constant dès son ajout. | O(E·α(V)) |
| Tri topologique de Kahn | Orienté, et tu veux aussi l'ordre s'il n'y a pas de cycle. Les sommets restants une fois la file vidée sont exactement la partie cyclique. | O(V + E) |
| CFC de Tarjan | Orienté, et tu veux savoir quels sommets appartiennent à des cycles plutôt que seulement s'il en existe un. Toute composante de taille supérieure à un est un cycle. | O(V + E) |
| Détection de cycle de Floyd | Un graphe fonctionnel ou une liste chaînée où chaque sommet a exactement un successeur. Utilise O(1) de mémoire. | O(n) |
Lire l'article complet: Graph Algorithms in Coding Interviews
Algorithmes associés: Recherche en Profondeur (DFS), Tri Topologique, Algorithme de Kruskal