내가 학생시절 배울때 들었던 이 용어의 번역은 '강결합 요소'였다. 그런데 검색해보니 강결합요소, 강연결요소, 강한 결합 요소, 강한 연결 요소 등등이 모두 사용되고 있었다.. 일단 한국어 위키피디아를 기준으로 강한 연결요소라고 제목을 달아놓긴 했는데.. 웬만하면 그냥 SCC라고 부르는게 편할것 같다.
그래서 좀더 찾아보던중 pyrival에서 비교적 깔끔한 비재귀 DFS기반 구현체를 발견했다 - 소스코드. 타잔 알고리즘의 느낌으로 이해해보기에는 조금 다른부분이 많아서 의아해하다가, 아예 다른 알고리즘인 것을 뒤늦게 알게 되었다. 위키피디아에 코사라주, 타잔과 더불어 소개된 Path-based strong component algorithm이었다.
Path-based strong component algorithm의 위키 설명에 따르면, 그냥 path를 스택에 저장했다가 그걸 이용해서 처리하는 방식이면 대충 다 뭉퉁그려서 이렇게 부르는것 같고, 디테일하게는 여러 버전이 있는듯 하다. path 스택을 사용하지 않고, discovery order들만 저장해서 처리하는 타잔 알고리즘이 좀더 아름다운 느낌이긴 한데, 비재귀로 구현할때는 이게 더 구현이 간단했다.
scc를 사용하는 문제들 중 다수는 scc로 만든 condensation graph를 필요로 한다.
condensation graph에서, 소스 노드나 싱크 노드들을 구하는 문제
사실 이거는 굳이 condensation graph를 전부 만들지 않고 그냥 node to scc 매핑들로부터 바로 풀어나가는 것이 좀 더 효율적이긴 하다. 하지만 condensation graph를 만들어놓고 작업하는게 개념적으로 이해하는 것이나, 구현하는 것이나 더 간단하다..
condensation graph에서, 위상정렬 순서에 기반해서 DP를 수행하는 문제
등등..
그래서 결정 사항들
SCC를 만드는 함수
SCC to nodes 매핑만 리턴할것인가 (list[list[int]]) node to SCC 매핑도 리턴할것인가?