DFSトラバーサルでは、すべての子が終了するとノードが終了します。トラバーサル中に各ノードの検出時間と終了時間をマークすると、開始時間と終了時間を比較して、ノードが子孫であるかどうかを確認できます。実際、DFSトラバーサルは、次のルールに従ってエッジを分割します。
d [node]をノードの発見時間とし、同様にf [node]を終了時間とします。
括弧の定理すべてのu、vについて、次のいずれかが正確に当てはまります
。1. d [u] <f [u] <d [v] <f [v]またはd [v] <f [v] <d [u ] <f [u]であり、uとvのどちらも他方の子孫ではありません。
d [u] <d [v] <f [v] <f [u]であり、vはuの子孫です。
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":CCがAの内側にないため、A-> Cはクロスエッジです。
"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