Классификация ребер в DFS

согласно книге (Введение в алгоритм), в dfs ребра классифицируются как 4 вида:

  1. край дерева, если в edge (u,v), v сначала обнаружен, то (u, v) край дерева.
  2. задний край, если ......, v уже обнаружен, и v является предком, тогда это задний край.
  3. - передний край, если ......, v уже обнаружен, и v является потомком u, это передний край.
  4. поперечная кромка, все кромки, кроме вышеуказанных три.

мой вопрос в том, как я могу определить, является ли 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)