В глубине первого дерева есть ребра, определяющие дерево (то есть ребра, которые использовались при обходе).
Есть некоторые оставшиеся ребра, соединяющие некоторые другие узлы. В чем разница между поперечной кромкой и передней кромкой?
Из википедии:
Основываясь на этом остовном дереве, ребра исходного графа можно разделить на три класса: прямые ребра, которые указывают от узла дерева на одного из его потомков, задние ребра, которые указывают от узла к одному из его предков, и поперечные края, которые не делают ни. Иногда ребра дерева, ребра, которые принадлежат самому остовному дереву, классифицируются отдельно от передних ребер. Если исходный граф является ненаправленным, то все его ребра являются ребрами дерева или задними ребрами.
Разве ребро, которое не используется в обходе, который указывает от одного узла к другому, не устанавливает отношения родитель-потомок?
Ответы:
Википедия имеет ответ:
Все типы ребер появляются на этой картинке. Проследите DFS на этом графике (узлы исследуются в числовом порядке), и посмотрите, где ваша интуиция терпит неудачу.
Это объяснит диаграмму:
Передний край: (u, v), где v - это потомок u, но не ребро дерева. Это не дерево, которое соединяет вершину с потомком в DFS-дереве.
Поперечный край: любой другой край. Может проходить между вершинами в одном дереве с глубиной или в разных деревьях с глубиной. (непрофессионал)
Это любое другое ребро в графе G. Он соединяет вершины в двух разных DFS-деревьях или две вершины в одном и том же DFS-дереве, ни один из которых не является предком другого. (формальный)
источник
Обход DFS в неориентированном графе не оставит поперечного ребра, поскольку все ребра, попадающие в вершину, исследуются.
Однако в ориентированном графе вы можете встретить ребро, которое приводит к вершине, которая была обнаружена ранее, так что эта вершина не является предком или потомком текущей вершины. Такое ребро называется поперечным ребром.
источник
В обходе DFS узлы завершаются, когда все их дочерние элементы завершены. Если вы отметите время обнаружения и окончания для каждого узла во время обхода, то вы можете проверить, является ли узел потомком, сравнив время начала и окончания. Фактически любой обход DFS разделит его ребра в соответствии со следующим правилом.
Пусть d [узел] будет временем обнаружения узла, также пусть f [узел] будет временем окончания.
Например, рассмотрим граф с ребрами:
A -> B
A -> C
B -> C
Пусть порядок посещения будет представлен строкой меток узлов, где «ABCCBA» означает A -> B -> C (закончено) B (закончено) A (закончено), аналогично ((())).
Таким образом, «ACCBBA» может быть моделью для «(() ())».
Примеры:
«CCABBA»: тогда A -> C является поперечным ребром, поскольку CC не находится внутри A.
«ABCCBA»: Тогда A -> C является передним ребром (косвенный потомок).
"ACCBBA": Тогда A -> C - это край дерева (прямой потомок).
Источники:
CLRS:
https://mitpress.mit.edu/books/introduction-algorithms
Lecure Notes http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/GraphAlgor/depthSearch.htm
источник