그래프
SCC(강연결요소)
- Strongly Connected Component
- A에서 B로 갈 수 있다면, B에서 A로도 갈 수 있는 성질
- 방향성이 존재하는 유향 그래프에서 모든 정점이 다른 모든 정점들에 대하여 방문할 수 있는 경우
증명 방법
- 그래프 G에서 한 정점 V를 선택
- V에서 DFS를 통해 모든 정점으로 갈 수 있는지 확인
- 그래프 G의 간선 방향을 거꾸로 돌려 그래프 G’ 생성
- 그래프 G’에서 한 정점 V’를 선택
- V’에서 DFS를 통해 모든 정점으로 갈 수 있는지 확인
- 시간 복잡도: O(V+E)
강연결 성분
- 강연결성을 가지고 있는 서브 그래프들 (맥시멈 집합)
코사라주 알고리즘
- 방향그래프, 역방향그래프, 스택 준비
- 방향그래프의 임의의 정점에서 DFS 수행
- DFS가 끝나는 순서대로 스택에 삽입 (return 하면서 삽입)
- DFS 수행 후 방문하지 않은 정점이 있으면 해당 정점부터 다시 수행
- 스택의 top에서부터 pop하여 순서대로 역방향 그래프에서부터 DFS 수행
- 이때 탐색되는 모든 정점을 SCC로 묶는다.
- 스택이 비어있을 때까지 진행한다.
- 스택의 top 정점이 이미 방문한 정점이면 pop만 한다.
타잔 알고리즘
- 코드와 함께 보기
- 방문할 때마다 스택에 방문 정점을 저장 (코사라주는 끝나면서 저장하지만 타잔은 DFS 과정에서 저장)
- DFS 수행 순서, 즉 아직 방문하지 않은 정점에 대하여 방문하는 순서에 따라 각 정점에 고유한 id값 부여
- 자신과 연결된 정점 중, 이미 방문하였으나 SCC로 묶여있지 않은 정점(부모 정점)으로 갈 수 있다면 자신의 ret 값을 부모 정점의 id 값으로 변경(작은 id값으로 변경)
- ret 값이 자신의 고유 id값이라면 스택에서 자신이 나올 때까지 pop
- pop하는 과정에서의 모든 정점들은 자신과 SCC를 이룸 (SCC 배열에 같은 그룹으로 저장)
Transitive Closure
- A에서 B로 direct 하지 않지만 indirect 하게 갈 수 있는 경로를 찾는 알고리즘
- A -> C, C -> B 이면 A -> B
- 간접적으로 연결되어 있는 간선을 직접 갈 수 있는 간선으로 추가한 그래프
증명 방법
- DFS를 모든 정점에 대하여 수행
- 시간 복잡도: O(V(V+E))
- E는 V의 제곱보다 작거나 같다. (그래프 정의)
- 최악의 경우 V의 세제곱
- Floyd-Warshall Algorithm