백준 2150번. Strongly Connected Component에 대한 풀이를 Tarjan's Algorithm의 스니펫 느낌으로 작성.
x
)로 parent를 통일해야 하는 것이 타당하며, x
로 통일한다. import sys
input = lambda: sys.stdin.readline().rstrip()
miis = lambda: map(int, input().split())
sys.setrecursionlimit(10**5)
V, E = miis()
graph = [[] for _ in range(V+1)]
for _ in range(E):
A, B = miis()
graph[A].append(B)
latest = 1
order = [0] * (V+1) # 방문 순서
finished = [False] * (V+1)
stack = []
SCC = []
##########################
def get_scc(idx):
ret = []
t = 0
while t != idx:
t = stack.pop()
ret.append(t)
finished[t] = True
return ret
def dfs(i):
global latest
order[i] = latest; latest += 1
stack.append(i)
parent = order[i]
for j in graph[i]:
if order[j] and finished[j]:
continue
parent = min(parent, dfs(j) if not order[j] else order[j])
# order[j]가 택해지는 상황은, 오로지 사이클이 생기는 그 순간밖에 없음
if parent == order[i]:
SCC.append(get_scc(i))
return parent
for i in range(1, V+1):
if not order[i]:
dfs(i)
##########################
for i in range(len(SCC)):
SCC[i].sort()
SCC.sort(key=lambda x: x[0])
print(len(SCC))
for scc in SCC:
print(*scc, -1)