подход: 1
как насчет уровня без назначения для обнаружения цикла. Например: рассмотрите график ниже. A -> (B, C) B-> D D -> (E, F) E, F -> (G) E-> D Когда вы выполняете DFS, начинайте назначать уровень no узлу, который вы посещаете (корень A = 0). уровень № узла = родитель + 1. Таким образом, A = 0, B = 1, D = 2, F = 3, G = 4, тогда рекурсия достигает D, поэтому E = 3. Не отмечайте уровень для G (G уже назначен уровень, который не назначен, который больше, чем E). Теперь E также имеет преимущество перед D. Таким образом, при выравнивании можно сказать, что D должен получить уровень не равный 4. Но D уже имеет назначенный «более низкий уровень» ему 2. Таким образом, каждый раз, когда вы пытаетесь назначить номер уровня узлу во время выполнения DFS, для которого уже задан номер более низкого уровня, вы знаете, что ориентированный граф имеет цикл.
approach2:
используйте 3 цвета. белый, серый, черный. окрашивайте только белые узлы, белые узлы - в серый при переходе по DFS, а серые узлы - в черный при развертывании рекурсии (все дочерние объекты обрабатываются). если не все дочерние элементы еще обработаны, и вы попадаете в серый узел, который представляет собой цикл.
Например: все белое, чтобы начать в приведенном выше прямом графике.
цвета A, B, D, F, G окрашены в бело-серый цвет. G - лист, поэтому все дети обрабатывают его от серого до черного. рекурсия разворачивается в F (все обработанные дочерние элементы) окрашивают ее в черный цвет. теперь вы достигли D, у D есть необработанные дети, поэтому цвет E серый, G уже окрашен в черный, так что не спускайтесь дальше. E также имеет ребро к D, поэтому, продолжая обрабатывать D (D по-прежнему серый), вы обнаруживаете, что ребро обратно к D (серый узел), обнаруживается цикл.