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