SCC를 구하는 알고리즘 중 Kosaraju’s Algorithm을 알아봅시다.
작동 방식
이 그래프에서 SCC를 구해보겠습니다.
먼저, dfs tree를 만들어주면서, finish time을 저장해줍니다.
그 후, 그래프 상의 모든 간선을 뒤집어줍니다. (역방향 그래프)
역방향 그래프에서 finish time이 큰 정점부터 dfs를 수행해줍니다. 이 때 생성되는 dfs tree들이 각각 하나의 SCC가 됩니다.
구현 방법
BOJ2150번 문제 “Strongly Connected Component” 를 코드로 구현해봅시다.
그래프를 입력 받을 때, 역방향 그래프까지 같이 만들어줍시다.
1 |
|
dfs tree를 그려주면서, order라는 배열에 탐색이 먼저 끝나는 정점 순으로 저장해줍시다. (finish time)
dfs tree는 방문하지 않은 정점에 대해 dfs함수를 호출해주면서 그릴 수 있습니다.
1 |
|
order배열을 뒤집은 후, SCC를 구하기 위해 dfs를 다시 돌려줍니다.
이번에 dfs를 돌릴 때에는, 각 정점이 어떤 SCC에 속하는지 기록해줍니다.
1 |
|
전체 코드
1 |
|