SCC : Strongly Connected Component
Connecte Component는 undirected graph에서 존재한다
SCC는 directed graph에서 임의의 두 정점에 대해 양방향으로 가는 경로가 모두 있을 때, 존재한다
즉, 모든 노드가 양방향으로 reachable한 노드의 최대한 키운(Maximal Subset) 집합이다
//SCC는 사이클이 한 개 이상 겹쳐진 형태를 띤다. 하나의 정점도 SCC가 될 수 있다
[참고]
Directed graph : 문제를 해결한 알고리즘이 나왔을 때, 같은 방향으로 undirected graph에도 적용시켜 해결할 수 있다
Undirected graph : undirected graph에서 해결한다고 해서 directed graph가 해결되는건 아니므로, undirected graph일 때 문제를 해결하는 것이 더 어렵다.
Foward edge : 그래프의 간선 중, dfs트리 상에서 조상에서 자손으로 연결되지만 트리 간선이 아닌 간선
Back edge : 그래프의 간선 중, dfs트리 상에서 자손에서 조상으로 연결된 간선
Cross edge : 트리에서 조상과 자손관계가 아닌 정점들간에 연결된 간선
Pre Number : DFS 알고리즘이 노드에 처음 진입했을 때 부여되는 번호
Post Number : DFS 알고리즘이 리턴될 때 부여되는 번호
SCC를 찾는법
1. DFS를 한다
2. 트리들과 Cross, Foward, Back edge를 본다
- 시작지점에 따라 , 전진할 수 있는 곳이 여러개 있을 때 어디로 전진할지에 따라 DFS트리가 다르게 나온다.
트리를 만드는 전제가 왼쪽 먼저 전진하는 것으로 가정하면
cross edge는 <= 이 방향만 허용이 된다
'=>' 방향을 허용하지 않는 이유
왼쪽 먼저 전진하기 때문에 => 이 cross edge가 나오기 전 해당 서브트리 내에서 이미 방문한 상태가 된다
3. 하나의 트리는 SCC 몇개를 포함하지만, 한 SCC가 여러 트리에 나눠져있지 않다(한 SCC는 하나의 트리에 들어있다)
- 한번 SCC에 들어오면 SCC에 포함된 정점을 다 방문하기 때문에 다른 트리로 나눠질 수 없다
밖에서 들어오는 edge가 다 차단되었다고 가정한다
해당 트리에서 SCC를 분리해야하기 때문에 DFS를 또 진행한다
빨간선 : SCC
DFS를 SCC 1번의 한 정점부터 시작하면, SCC 1번이 분리된다
DFS를 SCC 2번의 한 정점부터 시작하면, SCC 2번이 분리된다
DFS를 SCC 3번의 한 정점부터 시작하면, SCC 2번을 포함한 SCC 3번이 분리된다
DFS를 4번 정점부터 시작하면?? edge를 다 뒤집고 다시 dfs를 시작하면 SCC가 아닌 부분 하나는 뗄 수 있다
나머진 ??
따라서 이렇게 진행하게 되면 잘 안된다
The Algorithm
1. DFS를 돌리면서 Post Numbers를 붙인다
2. 모든 link를 반대방향으로 뒤집는다
3. Post Numbers가 가장 큰 곳부터 시작한다
= 트리 하나에 SCC가 한개씩 들어있게 된다
증명
Super graph를 생각해보자
Super graph는 하나의 SCC가 Super graph의 한 노드가 된다
한 SCC에서 다른 SCC로 가는 link가 하나라도 있으면 edge를 추가한다
Super graph = DAG
//DAG가 되는 이유
pre와 post는 한 SCC안에서도 섞여있다(어디로 전진하는지에 따라 다르다)
1. Min pre
무조건 Min pre는 있다 link를 뒤집고 Min pre에서 시작하면 하나는 뗄 수 있지만,
다음으로 제일 작은 pre가 무엇인지 알 수 없다
2. Max pre
맨 오른쪽 위부터 가면 가능하지만, 맨 왼쪽에서부터 시작하는 경우 어디로 전진할지 모르기 때문에 알 수 없다
3. Min post
Max pre와 유사하다
4. Max post
먼저 link를 뒤집는다
빨간색으로 갈 경우(빨간색에서 시작할 경우)
파란색으로 갈 경우(파란색에서 시작할 경우) 리턴하고 다시 빨간색부분으로 오기 때문에 빨간색 부분에 가장 큰 post number가 있다는 것을 알 수 있다
즉, 전체에서 post가 가장 큰건 indegree가 0인 곳에 있다
among Trees
전체에서 post가 제일 큰 부분부터 해도, 저절로 트리가 분리되기(나눠지기) 때문에 트리들을 먼저 분리하고 진행하지 않아도 된다
'Algorithm > Basic Concept' 카테고리의 다른 글
[Lecture] BCC (0) | 2024.02.14 |
---|---|
[Lecture] Cut Vertex (0) | 2024.02.14 |
[Lecture] Graph Traversal (0) | 2024.02.14 |
[Lecture] Greedy Algorithms, Minimum Spanning Tree (0) | 2023.09.14 |
[Lecture] Sum, Binary Search, Selection Sort (0) | 2023.09.12 |