2部グラフ判定
アニマエールのOP・EDを聞いたら、見返す機運が高まってるえぬわいです。
今日は、蟻本に載ってる2部グラフ判定を自分で実装して理解しました。
ポイントとしては、
- とりあえず、塗っていって判定する
- 塗ってる最中でダメだと思ったら打ち切る
- 色は、符号を反転させたもので区別するとコードが減らせる
と言ったところかな。
pythonで書いたらこんな感じ
from collections import defaultdict G = defaultdict(list) # 色を保持するリスト。0 で初期化しておいて、訪れたことがあるかにも使う # 1, -1 のように反転させた符号にしておけば、-をつけただけでよくなる C = [] N, E = map(int, input().split()) for i in range(N): C.append(0) for i in range(E): fr, to = map(int, input().split()) G[fr].append(to) G[to].append(fr) def rec(pos, color): global C C[pos] = color for to in G[pos]: if C[to] == color: return False elif C[to] == 0 and not rec(to, -color): return False return True ans = True for i in range(N): if C[i] == 0: ans &= rec(i, 1) print(ans)
計算量は、辺と頂点を 1 度ずつ見ているので、O(|E|+|V|)
となるらしい。ふむ。俺もふわふわのクッションが足りないのかもしれない。ふむ。