Классификация ребер в DFS
согласно книге (Введение в алгоритм), в dfs ребра классифицируются как 4 вида:
- край дерева, если в edge (u,v), v сначала обнаружен, то (u, v) край дерева.
- задний край, если ......, v уже обнаружен, и v является предком, тогда это задний край.
- - передний край, если ......, v уже обнаружен, и v является потомком u, это передний край.
- поперечная кромка, все кромки, кроме вышеуказанных три.
мой вопрос в том, как я могу определить, является ли v предком или потомком u, когда я пытаюсь выяснить, является ли (u, v) задним или передним краем?
1 ответов
Если вам это действительно нужно, вы можете проверить его, поддерживая так называемые времена входа и выхода для каждого узла. Во время выполнения алгоритма вы увеличиваете a time
переменной (начиная с 0, Конечно) каждый раз, когда вы сталкиваетесь с новой вершины. Времени entry_t(v)
, exit_t(v)
изначально не заданы для всех вершин.
когда вы впервые сталкиваетесь с вершиной, вы устанавливаете entry(v):=time
. При выходе из вершины по восходящему краю (т. е. poping вершину из стека), вы устанавливаете его 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)