A топологическая сортировка - это порядок графа такой, что каждая стрелка соответствует порядку. Например, в вашем примере мы могли бы придумать порядок:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 15
Выполнить топологическую сортировку, используя для этого любой из O(n)
алгоритмов.
Далее мы пройдемся по графику и отследите, сколько входящих ребер имеет каждый узел.
Наконец, мы проходим график в нашем отсортированном порядке и отслеживаем, сколько ребер мы видели один конец, но не другой, и сколько узлов не имеют входящих ребер. Каждый раз, когда мы подходим к узлу, у которого все исходящие ребра не закончились, и у каждого будущего узла есть входящие ребра, это точка пересечения.
После этого мы можем подготовить две карты. Первый - от каждого узла до его топологического порядка. Второе - это сбалансированное бинарное дерево, в котором находятся критические точки.
Предварительный анализ - O(n)
. Фактические поиски теперь O(log(n))
.