-
강한 연결 요소 (Strongly Connected Components)CS/알고리즘 2023. 3. 12. 22:38반응형
유향 그래프에서 모든 정점이 도달 가능하면 강하게 연결되었다고 한다. 여기서 강한 연결 요소는 부분 그래프의 모든 정점이 강하게 연결된 것이다. 강한 연결 요소를 찾는 것은 O(V + E) 시간에 가능하다.
Transpose graph가 이를 찾는 알고리즘에서 사용되는데, 이는 원래 그래프의 모든 간선의 방향이 반대인 그래프이다.
강한 연결 요소를 찾는 알고리즘은 다음과 같다.
1. DFS를 수행한다.
2. DFS를 수행하고 각각이 끝날 때마다 스택에 집어넣는다.
3. Transpose graph에 대해서 DFS를 수행한다. 이 때 시작점은 스택에서 pop하는 순서대로이다.
4. DFS가 끝날 때마다 저장한다.
이를 C++로 구현하면 다음과 같다.
int v, e; vector<int> edges[10001]; vector<int> transpose[10001]; vector<bool> visited; stack<int> st; vector<int> tempNodes; vector<vector<int>> answer; void dfs(int start) { visited[start] = true; for (int i = 0; i < edges[start].size(); i++) { int next = edges[start][i]; if (!visited[next]) { dfs(next); } } st.push(start); } void transDfs(int start) { visited[start] = true; for (int i = 0; i < transpose[start].size(); i++) { int next = transpose[start][i]; if (!visited[next]) { transDfs(next); } } tempNodes.push_back(start); } int main() { visited = vector<bool>(v + 1, false); for (int i = 1; i <= v; i++) { if (!visited[i]) { dfs(i); } } visited = vector<bool>(v + 1, false); while (!st.empty()) { int present = st.top(); st.pop(); if (!visited[present]) { tempNodes = vector<int>(); transDfs(present); answer.push_back(tempNodes); } } }
반응형'CS > 알고리즘' 카테고리의 다른 글
위상 정렬 (Topological Sorting) (0) 2023.02.26 이진 탐색 2 (Binary Search) (0) 2023.02.25 플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm) (0) 2023.02.25 벨만-포드 알고리즘 (Bellman-Ford Algorithm) (0) 2023.02.25 다익스트라 알고리즘 (Dijkstra Algorithm) (0) 2023.02.25