Как насчет этого?
Вы знаете, что вершины, являющиеся частью циклов, должны иметь как исходящие, так и входящие ребра. Так что начните, как вы, с топологической сортировки и «удалите» (или просто отметьте) вершины с 0 входящими ребрами и удалите их уходящие ребра. Перейдите к соседям и удалите каждый, у которого теперь 0 входящих ребер, и продолжайте. Если у вас еще есть вершины в графе, вы знаете, что где-то в оставшихся вершинах есть цикл, но не где или сколько циклов. Так что именно здесь вы делаете сортировку с обратной топологией, когда начинаете удалять вершины с 0 исходящими ребрами. Это потому, что вы знаете, что вершина без исходящих ребер не может быть частью цикла. Продолжайте, как и в случае с топологической сортировкой, то есть удалите ребра вершины и повторите с соседями. Те вершины, которые остаются в вашем графе, являются частью одного или нескольких циклов. Чтобы узнать количество циклов и порядок появления вершин в каждом цикле, вы можете выполнить поиск в глубине среди оставшегося графа.
Если я не ошибаюсь, я считаю, что сложность должна быть O(|V| + |E|)