Почитал
статью в вики по достижимости в направленных графах. Алгоритмы, представленные в статье, либо тратят > O(n) на препроцессинг, либо требуют от графа много свойств, например,
An even faster method for pre-processing, due to T. Kameda in 1975,[7] can be used if the graph is planar, acyclic, and also exhibits the following additional properties: all 0-indegree and all 0-outdegree vertices appear on the same face
.
Не понимаю, почему, нельзя сделать следующим образом:
1. Найти конденсацию графа O(n) препроцессинга
2. Для конденсации построить структуру для нахождения LCA для За O(n) / O(nlogn) препроцессинга
Запрос будет выполняться за O(1) / O(logn) в зависимости от того, что используется для нахождения LCA:
1. Проверить, что u и v, находятся в одной SCC - O(1). Если да, то true, иначе сделать шаг 2
2. Проверить, что u и v находятся в одном DAG'е - O(1). Если нет, то false, иначе сделать шаг 3
3. Проверить, что LCA у u(from) и v (to) равен u (то есть они на одном пути от корня) - O(1) / O(logn), если да, то true, иначе false
Картинка для пояснения: для u, v - false, для u штрих,v штрих - true