Как определить, является ли вершина достижимой из другой вершины в направленном графе?

Какова причина невозможности реализовать алгоритмы достижимости в направленных графах следующим образом: 1) поиск конденсации графа с O(n) временем препроцессинга и 2) построение структуры для нахождения наименьшего общего предка (LCA) для конденсации с O(n) / O(nlogn) временем препроцессинга, чтобы выполнять запросы за O(1) / O(logn) времени?
  • 26 июля 2024 г. 9:53
Ответы на вопрос 3
Для определения, является ли вершина достижимой из другой вершины в направленном графе, можно использовать алгоритм обхода в глубину (DFS) или алгоритм обхода в ширину (BFS). Если после обхода из одной вершины есть путь к другой вершине, то они достижимы друг из друга.

Почему невозможно реализовать алгоритмы достижимости в направленных графах с такой сложностью? Это связано с тем, что построение конденсации графа и структуры для нахождения наименьшего общего предка (LCA) требуют определенного времени на препроцессинг, и при большом количестве вершин (n) это время может стать слишком большим. Невозможно достичь времени выполнения запросов за O(1) (или O(logn) для LCA) без соответствующего времени препроцессинга, поэтому данная цель может быть недостижима из-за ограничений вычислительных ресурсов.
Кажется нашёл проблему: алгоритм выше неправильно работает при наличии перекрёстных рёбер :( 
Например, если было бы ребро из 10 в 5

Под конденсацией вы подразумеваете сжатие компонент сильной связности? Ну так у вас остается в конце какой-то произвольный DAG, а не дерево. 

В нем уже нельзя ввести поняие LCA вообще. Например, граф 0->2, 0->3, 1->2, 1->3. Тут для вершин 2 и 3 есть два общих предка: 0 и 1. И какой из них самый нижний?
Похожие вопросы