サイクル検出(DFS)
説明
DFSしながら訪問直後はその頂点を「処理中」としておき、DFSの途中で「処理中」ノードに到達したらサイクルがあったことになる。
WHITE = 0 # 未訪問
GRAY = 1 # 処理中
BLACK = 2 # 処理完了
def dfs(u, graph, color):
# DFSしながらサイクルを検出したら True を返す
color[u] = GRAY
for v in graph[u]:
if color[v] == GRAY:
return True
elif color[v] == BLACK:
continue
if dfs(v, graph, color):
return True
color[u] = BLACK
return False
def solve(n,m,graph):
color = [WHITE for _ in range(n)]
for i in range(n):
if color[i] == WHITE:
loop = dfs(i, graph, color)
if loop:
return 'Yes'
return 'No'
Python
関連記事
逆元の計算方法
説明 フェルマーの小定理を使った逆元の計算方法 xinv = pow(x, MO ...
順列の辞書順での前後を求める
説明 ある順列が与えられたとき、辞書順でその順列の前後を求める def next ...
2次元リストの回転
説明 2次元のリストを行列とみたときの時計回り90°回転、反時計回り90°回転、 ...
最長増加部分列(LIS)
最長増加部分列とは 数列 {Ai} が与えられたとき、並び ...
bisect_left と bisect_right
両者の違い bisect_left(list, value)bisect_rig ...
ディスカッション
コメント一覧
まだ、コメントがありません