Разница между поперечными и передними кромками в DFT

11

В глубине первого дерева есть ребра, определяющие дерево (то есть ребра, которые использовались при обходе).

Есть некоторые оставшиеся ребра, соединяющие некоторые другие узлы. В чем разница между поперечной кромкой и передней кромкой?

Из википедии:

Основываясь на этом остовном дереве, ребра исходного графа можно разделить на три класса: прямые ребра, которые указывают от узла дерева на одного из его потомков, задние ребра, которые указывают от узла к одному из его предков, и поперечные края, которые не делают ни. Иногда ребра дерева, ребра, которые принадлежат самому остовному дереву, классифицируются отдельно от передних ребер. Если исходный граф является ненаправленным, то все его ребра являются ребрами дерева или задними ребрами.

Разве ребро, которое не используется в обходе, который указывает от одного узла к другому, не устанавливает отношения родитель-потомок?

soandos
источник
Связано: cs.stackexchange.com/questions/99988/… стремится создать алгоритм, который для ориентированного графа предпочтет делать передние ребра вместо перекрестных ребер во время поиска в глубину.
pfalcon

Ответы:

23

Википедия имеет ответ:

введите описание изображения здесь

Все типы ребер появляются на этой картинке. Проследите DFS на этом графике (узлы исследуются в числовом порядке), и посмотрите, где ваша интуиция терпит неудачу.


Это объяснит диаграмму:

Передний край: (u, v), где v - это потомок u, но не ребро дерева. Это не дерево, которое соединяет вершину с потомком в DFS-дереве.

Поперечный край: любой другой край. Может проходить между вершинами в одном дереве с глубиной или в разных деревьях с глубиной. (непрофессионал)
Это любое другое ребро в графе G. Он соединяет вершины в двух разных DFS-деревьях или две вершины в одном и том же DFS-дереве, ни один из которых не является предком другого. (формальный)

Юваль Фильмус
источник
Почему 6 невозможно пройти сначала (сначала справа)? Если бы это случилось, как бы назывался край 2-> 3?
Soandos
@ Soandos, я предлагаю вам самим отследить алгоритм. Предполагая, что википедисты не ошиблись, изображение описывает добросовестный прогон DFS на этом графике, и поэтому есть способ вписать алгоритм в эту трассировку. Типы ребер достаточно четко описаны в Википедии, и вы также можете обратиться к этому примеру.
Юваль Фильмус
Я понимаю, что это правильный способ сделать DFS. Я просто спрашиваю, что если бы это было сделано другим способом.
Soandos
Тогда результаты будут другими. Извините, вам придется решить это самостоятельно.
Юваль Фильмус
2
@soandos В общем, вполне может быть несколько обходов DFS. Используемые здесь понятия относятся к одному заданному обходу и будут отличаться для нескольких обходов.
Рафаэль
9

Обход DFS в неориентированном графе не оставит поперечного ребра, поскольку все ребра, попадающие в вершину, исследуются.

Однако в ориентированном графе вы можете встретить ребро, которое приводит к вершине, которая была обнаружена ранее, так что эта вершина не является предком или потомком текущей вершины. Такое ребро называется поперечным ребром.

Апурв Гупта
источник
Апоров, спасибо за ответ. Мне все еще кажется, что когда вы добираетесь до вершины 6 в DFS, как показано на диаграмме в Википедии, у вас есть три ребра, чтобы пройти от 6. В этот момент, вершина 6 является «текущей». В конце концов вы собираетесь пересечь ребро до вершины 3. Хотя 3 уже посещено, тем не менее, поскольку существует ребро от 6 до 3, то 3 является потомком «текущей» вершины 6. Если это так, то это нарушает определение поперечного края. В определении должно быть что-то еще, что не делается слишком явно.
Фактически, DFS содержит только ребра дерева для задних ребер (Введение в алгоритмы Thm. 22.10).
jrhee17
2

В обходе DFS узлы завершаются, когда все их дочерние элементы завершены. Если вы отметите время обнаружения и окончания для каждого узла во время обхода, то вы можете проверить, является ли узел потомком, сравнив время начала и окончания. Фактически любой обход DFS разделит его ребра в соответствии со следующим правилом.

Пусть d [узел] будет временем обнаружения узла, также пусть f [узел] будет временем окончания.

Теорема о скобках Для всех u, v справедливо одно из следующих утверждений:
1. d [u] <f [u] <d [v] <f [v] или d [v] <f [v] <d [u ] <f [u] и ни один из u и v не является потомком другого.

  1. d [u] <d [v] <f [v] <f [u] и v является потомком u.

  2. d [v] <d [u] <f [u] <f [v] и u является потомком v.

Таким образом, d [u] <d [v] <f [u] <f [v] не может произойти.
Как и в скобках: () [], ([]) и [()] в порядке, но ([)] и [(]) не в порядке.

Например, рассмотрим граф с ребрами:
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

Крис Хафли
источник