36. strongly connected component [13 2주차]

Posted by aliontory on January 15, 2024 · 38 mins read

36. Strongly Connected Component [13-2주차]

2024 1 14일 일요일

오후 5:05

<SCC : Strongly Connected Component>

어떤 그래프의 SCC는 노드들의 부분집합으로, SCC내의 임의의 두 노드 a, b에 대해 a에서 b로 가는 경로도 있고 b에서 a로 가는 경로도 있도록 하는 최대 크기의 집합이다.

SCC는 사이클이 한 개 이상 겹쳐진 형태를 띤다.

하나의 정점도 SCC가 될 수 있다.

 

SCC가 존재하는 그래프는 DAG는 아니지만, SCC를 찾는 알고리즘은 Topological Sort와 유사하다.

 

 

<Supergraph>

SCC를 찾는 알고리즘을 구하기 위해, 그래프 G.SCC를 다음과 같이 정의한다.

그래프 G SCC C1, C2, , Ck 라 한다.

G.SCC 는 노드 집합 V.SCC = {v1, v2, , vk} 와 간선 집합 E.SCC로 구성된다.

xCi, yCj 에 대해 G에 방향 간선 (x, y)가 있으면 (vi, vj)E.SCC 가 성립한다.

(방향 그래프에서 간선(x, y) x->y방향의 간선을 의미한다)

 

, G.SCC는 그래프 G의 각 SCC를 하나의 노드로 축소시킨 그래프이다.

 

G.SCC는 항상 DAG가 된다.

 

  • 증명 : C C' G의 서로 다른 SCC라 하자. u, vC이고 u', v'C' 이라 한다. 또한 G는 경로 u~>u'을 포함한다고 한다. 이때 G가 경로 v'~>v를 포함한다면,

경로u~>u'~>v' v'~>v~>u 가 존재하므로 u v'이 다른 SCC에 있다는 것에 모순이 발생한다.

따라서 G에 경로 u~>u'이 존재하면, 경로 v~>v'은 존재할 수 없다. C~>C'으로의 경로가 존재하면, C'~>C로의 경로는 존재할 수 없고, G.SCC는 사이클이 존재하지 않아 DAG가 된다.

 

G.SCC Supergraph라 부른다. Supergraph의 노드(하나의 SCC)들은 Supernode라 부른다.

 

 

<post 번호의 특성>

SCC를 구하기 위해서는 DFS를 하여 각 노드의 post번호를 구해야 한다. 이때, 어떤 SCC C에 대하여, post(C)를 다음과 같이 정의한다.

post(C) = maxuC{u.post}

post(C) C에 있는 노드의 post번호 최댓값이다.

이때 다음이 성립한다.

 

SCC C, C'에서, C의 어떤 노드 v C'의 어떤 노드 v'에 대해, 간선(v, v')이 존재하면, post(C)>post(C') 이다.

  • 증명
    • DFS C의 노드부터 방문하는 경우

C의 노드 중 가장 먼저 방문되는 노드를 x라 한다. 간선 (v, v')이 존재하므로, C C'의 노드들은 하나의 DFS트리에 포함되게 된다. 또한 x를 가장 먼저 방문했으므로, DFS 트리에서 C C'의 나머지 노드들은 x의 자손이 된다. 따라서 C C'의 노드들 중 x post번호가 가장 크고, post(C)>post(C')이 성립한다.

  • DFS C'의 노드부터 방문하는 경우

요소 그래프가 DAG가 되므로, C'에서 C로의 경로는 존재하지 않는다. 따라서 C'의 노드들의 DFS가 완전히 끝난 다음 C의 노드들이 방문되므로,

post(C)>post(C')이 성립한다.

 

 

<SCC 알고리즘과 증명>

위에서 알아낸 성질들을 이용하면, 그래프 G SCC를 찾는 알고리즘은 다음과 같다.

 

SCC(graph G) {

  • DFS(G)를 호출하여 노드의 post번호를 구함
  • G의 모든 간선 방향을 거꾸로 뒤집은 그래프 GT를 만듬
  • DFS(GT)를 호출하여 DFS트리를 구함. 이때, 각 라운드마다 post번호가 가장 큰 노드부터 DFS 시작.

}

 

알고리즘 3행에서, DFS트리 각각이 하나의 SCC가 된다.

 

알고리즘의 정확성 증명은 다음과 같다.

 

모든 간선의 방향을 뒤집으면 SCC는 변하지 않는다. 따라서 G GT SCC는 같다.

또한 위에서 증명한 post번호의 특성에 의해 다음이 성립한다.

  • SCC C, C'에서, C의 어떤 노드 v C'의 어떤 노드 v'에 대해, 간선(v', v)이 존재하면, post(C)>post(C') 이다.

(post번호는 GT가 아니라 G를 기준으로 매긴다)

 

마지막으로, 수학적 귀납법을 통해 알고리즘을 증명해 보자.

  • Base : post값이 최대인 노드를 x라 하고, x가 포함된 SCC C라 하자. 위 증명에 의해, C로부터 다른 SCC로 향하는 간선은 GT에 존재하지 않는다. 따라서 노드 x에서 DFS를 시작하면, x를 루트로 가지는 DFS트리의 노드 집합은 C가 된다.
  • Step : DFS(GT)로부터 만들어진 첫 k개의 트리가 각각 SCC라고 하자.

k+1번째로 만들어진 트리의 루트가 u일 때, u SCC C에 속한다고 가정한다. 알고리즘은 post값이 가장 큰 노드를 DFS의 시작점으로 선택하므로, 아직 방문되지 않은 임의의 SCC C'에 대해 u.post = post(C) > post(C')이 성립한다. 따라서 GT에서 C를 나가는 방향의 간선은 모두 이미 방문한 SCC를 향하고, k+1번째 DFS 트리는 하나의 SCC가 된다.

 

OneNote에서 작성되었습니다.