Если вам это действительно нужно, вы можете проверить это, поддерживая так называемое время входа и выхода для каждого узла.Во время выполнения алгоритма вы увеличиваете переменную time
(конечно, начиная с 0) каждый раз, когда встречаете новую вершину.Времена entry_t(v)
, exit_t(v)
изначально не установлены для всех вершин.
Когда вы впервые сталкиваетесь с вершиной, вы устанавливаете entry(v):=time
.Когда вы выходите из вершины по верхнему краю (т. Е. Извлекаете вершину из стека), вы устанавливаете ее exit(v):=time
.При этом у вас будет
- , если установлено
entry(u)
, а exit(u)
не установлено, то u является предком текущей вершины (т. Е. Vu является задним краем) - если
entry(u)>entry(current)
, то u является потомком текущей вершины (current-> u - передний край) - в противном случае это перекрестный край
Обратите внимание, что эти отношенияпредназначены для проверки во время работы алгоритма.После того, как алгоритм завершен, проверка предков в основном
u is_descendant_of v = entry(u)>entry(v) and exit(u)<=exit(v)