자료구조(data structure)

타잔 알고리즘(SCC:강한 결합 연결) - 파이썬(python)

진한색 2023. 1. 5. 14:11
# 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

 

참고

c++:https://blog.naver.com/ndb796/221236952158

파이썬:https://storyofvector7.tistory.com/44

 

[알고리즘] 강한 연결 요소(2): 타잔 알고리즘

강한 연결 요소 (Strongly Connected Component) 시리즈 1. 코사라주 알고리즘 2. 타잔 알고리즘 3. 2-SAT 소개 지난 챕터 에서는 코사라주 알고리즘의 소개와 증명에 대해서 설명했습니다. 코사라주 알고리

storyofvector7.tistory.com

 

728x90