有向グラフのサイクル検出
ノードを色付けして後退辺を見つけます
「有向グラフのサイクル検出」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。
閉路が重要な理由
有向閉路があると、依存関係が互いを参照し続けます。閉路を見つければ、トポロジカル順序も有効なスケジュールも存在しないと分かります。
無向グラフとは異なる
ここでの閉路検出では向きが重要です。辺を逆方向にたどることは数えないため、無向グラフの方法は使えません。
3色で管理する考え方
各ノードに3色のいずれかを割り当てます。白は未訪問、灰色は処理中、黒は処理完了を表します。
WHITE, GRAY, BLACK = 0, 1, 2
color = [WHITE] * n灰色はスタック上を表す
灰色のノードは、現在のDFSパス上にあります。そのノードには到達済みですが、すべての子孫の探索はまだ終わっていません。
ノードに入る
DFSでノードに到達したら、探索する前に灰色にします。これにより、そのノードが現在の経路に含まれることを記録します。
def dfs(u):
color[u] = GRAY後退辺の合図
すでに灰色の隣接ノードに到達したら、現在の経路へ戻る後退辺を見つけたことになります。これは閉路です。
for v in adj[u]:
if color[v] == GRAY:
return True # cycle白いノードへ再帰する
白の隣接ノードは未探索なので、そこへ再帰します。深い呼び出しのいずれかが閉路を報告したら、すぐに True を上へ返します。
elif color[v] == WHITE and dfs(v):
return True黒なら安全
黒の隣接ノードは探索済みで、閉路もないため無視できます。もう一度たどっても時間を無駄にするだけです。
ノードの処理を終える
すべての隣接ノードを処理したら、そのノードを黒にします。これで現在の経路から離れ、処理完了として記録されます。
color[u] = BLACK
return Falseすべての連結成分を調べる
グラフは非連結の場合があるため、まだ白いノードすべてを始点にしてDFSを開始し、全体を確実に調べます。
if any(color[u]==WHITE and dfs(u) for u in range(n)):
print('cycle')再帰の上限に注意する
深いグラフでは、Pythonの再帰スタックがあふれることがあります。上限を引き上げるか、明示的なスタックを使うDFSに書き換えてください。
import sys
sys.setrecursionlimit(300000)理解度チェック
DFS中に、現在灰色になっている隣接ノードへ到達しました。何を見つけたことになりますか?
まとめ: 閉路検出
ノードを白、灰色、黒の順に色付けします。DFS中に灰色の隣接ノードがあれば、それは後退辺であり、有向閉路の存在が証明されます。🔁
よくある質問
「有向グラフのサイクル検出」レッスンは無料ですか?
はい。「有向グラフのサイクル検出」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。
「有向グラフのサイクル検出」で何を学びますか?
ノードを色付けして後退辺を見つけます ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Coding Interview Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「有向グラフのサイクル検出」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCoding Interview Prepレッスンでコードを書いて実行できますか?
はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Kahn のアルゴリズムによるトポロジカルソート
- 有向グラフのサイクル検出
- 強連結成分
- 橋と関節点