본문으로 건너뛰기
김신건의 로그

Tarjan SCC: 강한 연결 요소 O(V+E)

· 수정 · 📖 약 1분 · 192자/단어 #algorithm #graph #scc #tarjan
Tarjan SCC, Tarjan's SCC, 강한 연결 요소, SCC

정의

Strongly Connected Component (SCC) 는 유향 그래프에서 서로 도달 가능한 정점들의 극대 집합입니다.

Tarjan’s algorithm 은 단일 DFS 로 SCC 를 O(V + E) 에 구합니다.

알고리즘

각 정점 v 에 대해:

  • disc[v]: DFS 방문 시각
  • low[v]: v 서브트리 (트리 + back edge 로) 에서 도달 가능한 최소 disc

DFS 스택 (stk) 에 방문 정점 저장. disc[v] == low[v] 인 순간 스택에서 v 까지 pop 하여 하나의 SCC.

int idx = 0, cnt = 0;
vector<int> disc, low, comp, stk;
vector<bool> on_stack;

void dfs(int u) {
    disc[u] = low[u] = idx++;
    stk.push_back(u); on_stack[u] = true;
    for (int v : adj[u]) {
        if (disc[v] == -1) { dfs(v); low[u] = min(low[u], low[v]); }
        else if (on_stack[v]) low[u] = min(low[u], disc[v]);
    }
    if (low[u] == disc[u]) {
        while (true) {
            int v = stk.back(); stk.pop_back();
            on_stack[v] = false;
            comp[v] = cnt;
            if (v == u) break;
        }
        cnt++;
    }
}

응용

  • 2-SAT: 함의 그래프의 SCC 로 해결
  • DAG 축약: SCC 를 노드로 축약하면 DAG
  • 의존성 사이클 탐지

대안

  • Kosaraju: 두 번 DFS (그래프 + 역그래프), 이해 쉬움
  • Path-based SCC (Gabow)

참고

이 글의 용어 (3개)
2-SAT (2-Satisfiability)algorithm
정의 2-SAT (2-Satisfiability) 는 각 절(clause)이 정확히 두 리터럴(literal)의 OR 로 이루어진 CNF (Conjunctive Normal Fo…
위상 정렬 (Topological Sorting)algorithm
정의 위상 정렬 (Topological Sorting) 은 방향 비순환 그래프 (DAG) 의 모든 정점을 간선 방향을 어기지 않도록 일렬로 나열하는 것. 간선 가 있으면 정렬 결…
Cycle Detection: 그래프 사이클 탐지algorithm
정의 그래프에 사이클이 존재하는가, 또는 어느 사이클인가 를 찾는 문제. 무향 그래프 Union-Find 접근 간선 (u, v) 삽입 시 이면 사이클. DFS 접근 부모가 아닌 …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기