Я работаю над следующим прошлым бумажным вопросом для модуля алгоритмов:
Пусть G = (V, E) — простой ориентированный ациклический граф (DAG).
Для пары вершин v, u в V мы говорим, что v достижима из u, если существует (направленный) путь из u в v в G.
(Мы предполагаем, что каждая вершина достижима из самой себя.)
Для любой вершины v в V пусть R(v) будет числом достижимости вершины v, то есть числом вершин u в V, которые достижимы из v.
Разработайте алгоритм, который для данного DAG, G = (V, E), вычисляет значения R(v) для всех вершин v в V.
Предоставьте анализ вашего алгоритма (т. е. анализ корректности и времени выполнения).
(Оптимально нужно попытаться разработать алгоритм, работающий за время O(n + m).)
Итак, пока у меня следующие мысли:
Может оказаться полезным следующий алгоритм нахождения топологического вида DAG:
TopologicalSort(G)
1. Run DFS on G and compute a DFS-numbering, N // A DFS-numbering is a numbering (starting from 1) of the vertices of G, representing the point at which the DFS-call on a given vertex v finishes.
2. Let the topological sort be the function a(v) = n - N[v] + 1 // n is the number of nodes in G and N[v] is the DFS-number of v.
Вторая моя мысль заключается в том, что динамическое программирование тоже может быть полезным подходом.
Однако в настоящее время я не знаю, как объединить эти две идеи в решение.
Буду признателен за любые подсказки!