172
правки
Изменения
→Дерево обхода в глубину
== Дерево обхода в глубину ==
[[Image:tree_edges.png|thumb|270px|Типы ребер, определяемые деревом обхода]]
Рассмотрим подграф предшествования обхода в глубину <tex>G_p = (V, E_p)</tex>, где <tex>E_p = \{(p[u], u) : u \in V,\ p[u] \neq NIL\}</tex>, где в свою очередь <tex>p[u]</tex> — вершина, от которой был вызван <tex>dfs(u)\ </tex> (для вершин, от которых <tex>dfs</tex> был вызван нерекурсивно это значение соответственно равно <tex>NIL</tex>). Подграф предшествования поиска в глубину образует ''лес обхода в глубину'', который состоит из нескольких ''деревьев обхода в глубину''. Назовем ''ребрами дерева'' те С помощью полученного леса можно классифицировать ребра из графа <tex>G</tex>, которые вошли в <tex>G_p</tex>. Рассмотрим такие :* ''Ребрами дерева'' назовем те ребра графа из <tex>G</tex>, которые не попали вошли в <tex>G_p</tex>. * Ребра <tex>(u, v)</tex>, соединяющие вершину <tex>u</tex> с её предком <tex>v</tex> в дереве обхода в глубину назовем ''обратными ребрами''(для неориентированного графа предок должен быть ''не родителем'', так как иначе ребро будет являться ребром дерева). * Ребра <tex>(u, v)</tex>, не являющиеся ребрами дерева и соединяющие вершину <tex>u</tex> с её потомком <tex>v</tex> в дереве обхода в глубину назовем ''прямыми ребрами''(в неориентированном графе нет разницы между прямыми и обратными ребрами, поэтому все такие ребра считаются обратными). * Все остальные ребра назовем ''перекрестными ребрами'' — такие ребра могут соединять вершины одного и того же дерева обхода в глубину, когда ни одна из вершин не является предком другой, или соединять вершины в разных деревьях.
Алгоритм <tex>dfs</tex> можно модифицировать так, что он будет классифицировать встречающиеся при работе ребра. Ключевая идея состоит в том, что каждое ребро <tex>(u, v)</tex> можно классифицировать при помощи цвета вершины <tex>v</tex> при первом его исследовании, а именно:
* Белый цвет вершины <tex>v</tex> по определению <tex>dfs</tex> говорит о том, что это ''ребро дерева''.
* Серый цвет в силу того, что серые вершины всегда образуют нисходящий путь в каком-либо из деревьев <tex>dfs</tex> и встреченная вершина <tex>v</tex> лежит на нем выше вершины <tex>u</tex>, определяет ''обратное ребро''.(для неориентированного графа необходимо проверить условие <tex>v \neq p[u]</tex>)
* Черный цвет, соответственно, указывает на ''прямое'' или ''перекрестное ребро''.