코딩테스트/백준(BOJ)
백준(BOJ) - Strongly Connected Component(2150번) - 파이썬(python)
진한색
2023. 1. 5. 14:13
https://www.acmicpc.net/problem/2150
2150번: Strongly Connected Component
첫째 줄에 두 정수 V(1 ≤ V ≤ 10,000), E(1 ≤ E ≤ 100,000)가 주어진다. 이는 그래프가 V개의 정점과 E개의 간선으로 이루어져 있다는 의미이다. 다음 E개의 줄에는 간선에 대한 정보를 나타내는 두 정
www.acmicpc.net
강한결합연결(scc)
import sys
sys.setrecursionlimit(1000000)
input=sys.stdin.readline
# strongly connected component
def scc(g,v):
finished=[False]*(v+1)
label=[0] # 누적 라벨 : 노드를 한번 방문 할때마다 1씩 증가
labels=[0]*(v+1) # 고유 라벨 저장
ans,s=[],[]
def _scc(u):
label[0]+=1
parent=labels[u]=label[0]
s.append(u)
for v in g[u]:
if not labels[v]:
parent=min(parent,_scc(v))
elif not finished[v]:
# 방문 했었으나 scc처리가 아직 안된 노드 = 사이클
parent=min(parent,labels[v])
if parent==labels[u]:
# 자기 자신이 사이클 중 가장 먼저 탐색= 루트노드
scc_set=[]
while s:
p=s.pop()
scc_set.append(p)
finished[p]=True
if u==p:
break
ans.append(scc_set)
return parent
for e in range(1,v+1):
if not labels[e]:
_scc(e)
return ans
v,e=map(int,input().rstrip().split())
g=[list() for _ in range(v+1)]
for _ in range(e):
u,vv=map(int,input().rstrip().split())
g[u].append(vv)
ans=scc(g,v)
for e in ans:
e.sort()
ans.sort(key=lambda e: e[0])
print(len(ans))
for e in ans:
res=''
for _e in e:
res+=str(_e)+' '
res+='-1'
print(res)
728x90