回答:
DFSを実行するとき、ノードは3つの状態のいずれかになります-訪問される前、子孫を再帰的に訪問している間、およびすべての子孫が訪問された後(親に戻る、つまり後処理段階)。3つの色は、3つの状態のそれぞれに対応しています。色と訪問と戻りの時間に言及する理由の1つは、理解を深めるためにこれらの区別を明示的に行うことです。
もちろん、これらの色の実際の用途があります。有向グラフ考えます。のサイクルの存在をチェックするとします。無向グラフでは、検討中のノードに黒または灰色の隣接がある場合、サイクルを示します(そして、DFSはあなたが言及したようにそれを訪問しません)。しかし、の場合に方向付けグラフ、ブラック隣接サイクルを意味するものではありません。たとえば、3つの頂点およびを持ち、、、ような有向エッジを持つグラフを考えます。DFSがで始まり、次に、次にアクセスするとします。に戻ったとき、次にが既にアクセスされており、黒であることを確認します。しかし、グラフにはサイクルがありません。
有向グラフでは、すべての子孫が訪問される前にノードが再び表示される場合にのみ、サイクルが存在します。言い換えると、ノードにグレーのネイバーがある場合、サイクルがあります(ネイバーが黒の場合ではありません)。灰色のノードは、現在その子孫を探索していることを意味します。そのような子孫の1つがこの灰色のノードへのエッジを持っている場合、サイクルがあります。したがって、有向グラフでのサイクル検出には、3色が必要です。他の例もありますが、あなたはアイデアを得る必要があります。
灰色の頂点は、そのノードを訪問し、あるノードの隣のノードに移動したことを示していますが、そのノードにはさらに多くの隣接する頂点がある可能性があります。これは、未訪問の頂点を探索するためのバックトラッキング中に役立ちます。
レッツは言う頂点Aは、2人の隣人BとCがあり、Bは一つの隣接Dを持っています。
白い色の頂点Aから開始し、灰色にし、その隣に移動します。
アルファベット順を選択して、白色で灰色としてマークされている頂点Bにアクセスするとします。
次に、白のDを訪問->灰色のD- >隣人はもういません。したがって、D-> blackとマークされます。
現在、グレーでBにバックトラックし、これ以上nieghborsはありません。したがって、B->黒とマークされます。
再び灰色とするマークC訪問におけるA後戻りC->グレーブラックとしてもはや近隣マークCを
最後に、Aに戻って、頂点Aが黒であるとマークします。これは、白い頂点がなくなり、すべて黒になるためです。
DFSでは、エッジをフォワードエッジ、バックエッジ、クロスエッジ、ツリーエッジに分類します。
3色を使用してエッジを分類します。そして、これらの色は、頂点の状態、すなわちv。白を表します:頂点vはまだ発見されていません。
灰色:vはすでに発見されていますが、vから到達可能なすべての頂点はまだ発見されていません。そのため、頂点vはまだスタック内にあります。
黒:vはすでにstack.discoveredからポップアウトされ、終了しています。
DFSを実行する際に、エッジeを介して灰色の頂点に遭遇した場合、それはバックエッジです。エッジeを介して黒い頂点に遭遇した場合、それはクロスエッジ/フォワードエッジです。白い頂点に遭遇した場合、DFSを再帰的に呼び出します。