DFTのクロスエッジとフォワードエッジの違い


11

深さ優先ツリーには、ツリーを定義するエッジがあります(つまり、トラバーサルで使用されたエッジ)。

他のノードのいくつかを接続するいくつかの残りのエッジがあります。クロスエッジとフォワードエッジの違いは何ですか?

ウィキペディアから:

このスパニングツリーに基づいて、元のグラフのエッジは3つのクラスに分けることができます。ツリーのノードからその子孫の1つを指す前方エッジ、ノードからその祖先の1つを指す後方エッジ、そしてどちらもしないクロスエッジ。時々、スパニングツリー自体に属するエッジであるツリーエッジは、フォワードエッジとは別に分類されます。元のグラフが無向の場合、そのエッジはすべてツリーエッジまたはバックエッジです。

あるノードから別のノードを指すトラバーサルで使用されていないエッジは、親子関係を確立しませんか?


関連:cs.stackexchange.com/questions/99988/…は、有向グラフの場合、深さ優先検索中にクロスエッジではなくフォワードエッジを作成することを好むアルゴリズムを確立しようとします。
pfalcon 2018年

回答:


22

ウィキペディアには答えがあります:

ここに画像の説明を入力してください

この図には、すべてのタイプのエッジが表示されています。このグラフでDFSをトレースし(ノードは番号順に探索されます)、直感が失敗する場所を確認します。


これは図を説明します:-

前方エッジ:(u、v)、ここでvはuの子孫ですが、ツリーエッジではありません。DFSツリーの頂点と子孫に頂点を接続する非ツリーエッジです。

クロスエッジ:その他のエッジ。同じ深さ優先ツリーまたは異なる深さ優先ツリーの頂点間を移動できます。(素人)
グラフGの他のエッジです。2つの異なるDFSツリーの頂点、または同じDFSツリーの2つの頂点を接続しますが、どちらももう一方の祖先ではありません。(正式)


6を最初に(最初に右側を)トラバースすることが不可能ではないのはなぜですか?それが起こった場合、2-> 3エッ​​ジは何が呼び出されたでしょうか?
soandos 2013

@soandosさん、アルゴリズムをトレースするために自分で時間をかけることをお勧めします。ウィキペディアンが間違いを犯さなかったと仮定すると、画像はこのグラフでのDFSの正真正銘の実行を示しているため、アルゴリズムをこのトレースに合わせる方法があります。エッジのタイプはウィキペディアで十分に明確に説明されており、この例を参考にすることもできます。
Yuval Filmus

これはDFSを実行する有効な方法であることを理解しています。私は単にそれが逆の方法で行われたかどうかを尋ねています。
soandos 2013

その後、結果は異なります。申し訳ありませんが、自分で解決する必要があります。
Yuval Filmus

2
@soandos一般に、複数のDFSトラバーサルが発生する可能性があります。ここで使用されている概念は、1つのトラバーサルに関連しており、複数のトラバーサルでは異なります。
ラファエル

9

無向グラフのDFSトラバーサルは、頂点に入射するすべてのエッジが探索されるため、クロスエッジを残しません。

ただし、有向グラフでは、以前に発見された頂点につながるエッジに出くわし、その頂点が現在の頂点の祖先または子孫ではない場合があります。このようなエッジをクロスエッジと呼びます。


Aporov、回答ありがとうございます。ウィキペディアに示されているように、DFSの頂点6に到達すると、6からトラバースするエッジが3つあるように見えます。その時点で、頂点6は「現在」です。最終的に、頂点3へのエッジをトラバースします。3はすでにアクセスされていますが、6から3までのエッジがあるため、3は「現在の」頂点6の子孫です。そうであれば、違反します。クロスエッジの定義。明確にされていない定義にもっと何かがあるはずです。

実際、DFSにはバックエッジのどちらかのツリーエッジのみが含まれています(Intro to Algorithms Thm。22.10)。
jrhee17

2

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のどちらも他方の子孫ではありません。

  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":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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.