強連結成分分解
SCC, Strongly Connected Components
リファレンス
目指せグラフマスター / HCPC: 北海道大学競技プログラミングサークル
Pythonで強連結成分分解するのにscipyが高速に動く(らしい)話 / kawap23
code: SCC.py
# (参考)@kawap23 / Pythonで強連結成分分解するのにscipyが高速に動く(らしい)話
# https://kawap23.hatenablog.com/entry/2019/10/06/143159#%E3%81%BE%E3%81%A8%E3%82%81
def SCC(G): #非再帰関数で実装
"""
G: グラフ
O(V + E)
強連結成分数と,各頂点がどこに属すかを返す
"""
N = len(G)
RG = [[] for _ in range(N)]
for i in range(N):
for j in Gi:
RGj.append(i)
def dfs(v):
stack = v
usedv = True
while stack:
tmp = stack-1
flag = True
while Gtmp:
i = Gtmp.pop()
if not usedi:
flag = False
usedi = True
stack.append(i)
break
if flag: #どこにも行かなかった時
stack.pop()
vs.append(tmp)
def rdfs(v, k):
stack = v
usedv = True
cmpv = k
while stack:
tmp = stack-1
stack.pop()
for i in RGtmp:
if not usedi:
cmpi = k
stack.append(i)
usedi = True
used = False * N #既に調べたかどうか
vs = [] #帰りがけの並び
cmp = -1 * N
for i in range(N):
if not usedi:
dfs(i)
k = 0
used = False * N #既に調べたかどうか
for i in vs::-1:
if not usedi:
rdfs(i, k)
k += 1
return k, cmp #強連結成分分解をしたあとの要素数kとそれぞれの頂点がどこに位置するか