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


11

У глибині першого дерева є краї, які визначають дерево (тобто краї, які були використані в обході).

Залишилися ребра, що з'єднують деякі інші вузли. Чим відрізняється поперечний край від переднього краю?

З Вікіпедії:

Виходячи з цього розкинутого дерева, краї початкового графа можна розділити на три класи: передні краї, які вказують від вузла дерева до одного з його нащадків, задні ребра, які вказують від вузла до одного з його предків, і поперечні краї, які не роблять жодного. Іноді краї дерев, краї, які належать до самого відкидного дерева, класифікуються окремо від передніх країв. Якщо початковий графік непрямий, то всі його краї є країми дерева або задніми краями.

Чи не ребро, яке не використовується в обході, що вказує від одного вузла до іншого, не встановлює відносини батько-дитина?


Пов’язані дані: cs.stackexchange.com/questions/99988/… прагне встановити алгоритм, який для орієнтованого графіка воліє робити передні краї замість поперечних ребер під час першого глибинного пошуку.
pfalcon

Відповіді:


23

У Вікіпедії є відповідь:

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

На цьому малюнку відображаються всі типи ребер. Визначте DFS на цьому графіку (вузли досліджуються в числовому порядку) і подивіться, де ваша інтуїція не вдається.


Це пояснить схему: -

Передній край: (u, v), де v - нащадок u, але не край дерева. Це нерічковий край, який з'єднує вершину з нащадком у дереві DFS.

Поперечний край: будь-який інший край. Може проходити між вершинами в одному глибині першого дерева або в різних глибинах перших дерев. (мирянин)
Це будь-який інший край графіка G. Він з'єднує вершини у двох різних деревах DFS або двох вершин у тому ж дереві DFS, жодна з яких не є родоначальником іншого. (формальне)


Чому 6 неможливо пройти першим (спочатку права сторона)? Якби це сталося, як би назвали край 2-> 3?
soandos

@soandos, я пропоную витратити час на пошук алгоритму. Якщо припустити, що Wikipedians не помилилися, на зображенні описується сумлінний запуск DFS на цьому графіку, і тому існує спосіб вписати алгоритм у цей слід. Типи країв досить чітко описані у Вікіпедії, і ви також можете ознайомитися з цим прикладом.
Yuval Filmus

Я розумію, що це дійсний спосіб здійснення DFS. Я просто запитую, що робити, якщо це було зроблено іншим способом.
soandos

Тоді результати були б іншими. Вибачте, вам доведеться розробити це самостійно.
Yuval Filmus

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.