Вершины

и

имеют общего предка если существует вершина

такая, что из неё достижимы

и

.
Для данного ориентированного графа найти количество различных пар

таких, что

и

имеют общего предка.

(

- количество вершин,

- количество рёбер)
Time limit: 1.2 seconds
Ясно, что прежде всего нужно вычислить конденсацию. А вот дальше не ясно.
Много всяких идей перебрал, начинал с подзадачи типа "в каждой вершине ацикличного графа записано число, найти для каждой вершины сумму во всех её предках". Эту задачу решить не смог, да и сведение к основной оказалось неверным...
Кажется, что следует обрабатывать наименьшие вершины (без входящих рёбер) одну за другой.
Например, из первой наименьшей вершины сделали dfs, получили что достижимо

вершин (суммируем количество реальных вершин в каждой вершине конденсации), значит, есть уже

пар. Потом следующие делаем dfs из новых минимальных вершин и каждый раз получаем некоторое дерево. В этом дереве будут вершины, уже виданные в предыдущих dfs-ах и будет два числа

- количество вершин, уже виданных и

- количество новых вершин. Понятно, что к ответу надо добавить

.
Вот только сталкиваемся с проблемой - при новом dfs если мы встретили уже виданную вершину, то надо обламывать dfs и не идти дальше по рёбрам из этой вершины. А для этого надо хранить в каждой уже виданной вершине количество её предков, что уже является вариантом подзадачи, которую я приводил выше. При этом мы можем наткнуться на две виденных вершины, одна из которых является предком другой или просто множество достижимых из них вершин пересекаются и тут уж непонятно что делать.
В общем, я запутался и прошу помощи.
-- 17.09.2015, 09:00 --Прошу прощения, промахнулся с разделом. Переместите, пожалуйста, в "Олимпиадные задачи CS"