2006년 나온 알고리즘 책(S. Dasgupta et al.)을 공부하면서 개인적으로 정리한 노트입니다. 관련된 백준 문제를 풀어서 포스팅을 (언젠가) 올리면, 포스팅으로 대체할 생각입니다.
Chap.3은 이미 누군가 정리해둔 포스팅이 있습니다. 참고하면 좋을 것 같습니다.
Chap.3 정리: 또쟁 컴퓨터 공장
DFS 정리: victolee
3.1 Why graphs?
- vertex(node, 정점), edge(간선)으로 이루어짐
- Undirected/Directed, Cycle/Acyclic
- Adjacency matrix
3.2 Deph-first search in undirected graphs
- 깊이 우선 탐색!
- 인접한 노드 중 하나를 깊게 탐색 -> 더 이상 탐색 못 하면 그 다음 인접한 노드 탐색 -> ...
- stack 사용
- 탐색을 못 한다? -> Back tracking 사용해서 이전 노드(부모 노드)로 돌아가서 인접 노드 찾음
- Previsit/Postvisit ordering
- Pre: 처음 노드를 탐색한 시점에 numbering
- Post: 더 이상 뻗어나가지 못해 부모 노드로 돌아갈 때(back tracking) numbering
3.3 Depth-first search in directed graphs
- Forward/Back/Cross/Tree edge
- Tree edge: DFS에서 탐색하는데 사용한 edge
- Back edge: 자식 노드 -> 부모 노드를 잇는 edge, 존재하면 cycle 형성
- Foward edge: 부모 노드 -> 자식 노드를 잇는 edge, 탐색 순서에 따라 tree edge가 될 수도 있음
- Cross edge: 위 3가지 외 edge, 다른 tree를 잇는 edge 또는 자식 노드 -> 자식 노드를 잇는 edge
- pre,post number 순서로도 Tree/Foward, Back, Cross edge 구분 가능
- DAGs(Directed Acyclic Graphs)
- Direct edge + Acyclic graph => 방향성이 있고, cycle이 없는 그래프
- 특정 노드에서 출발해서 다시 자신으로 돌아오는 경로가 없음
- 줄 세우기 가능(linearization)!
- 시작 노드인 source와 끝 노드인 sink가 항상 최소 1개 이상 존재
- 몇 가지 성질
- Cycle이 없으므로, DFS 시 back edge가 없음
- 모든 edge는 낮은 post number의 노드로 향함
- 그럼 DAG를 어떻게 정렬할 수 있을까?
- DFS를 수행하면서 source를 제거하고, 또 DFS를 수행하면서 source를 제거하고... 반복
- O(V^2)
- Topological sort
- DFS에서 기록한 pre/post number를 통해 post 내림차순으로 정렬
- DFS의 시간복잡도인 O(V+E) -> Linear time에 가능!
- DAGs에서의 최단 거리를 찾는데 사용 가능
3.4 Strongly connected components(SCC)
- 백준 2150번
- SCC 내 node 임의의 A, B가 있다면, A -> B로 가는 path가 항상 존재함
- 다른 SCC끼리는 cycle이 존재하지 않음(SCC X -> SCC Y edge가 존재하면, SCC Y -> SCC X edge는 존재하지 않음)
- 이런 여러 SCC로 graph decomposition 가능
- 그럼 어떻게 SCC 찾음?
- Kosaraju's Algorithm
- 좋은 예시
- 1. DFS에서 구한 post number 기준 topological sort 수행
- Post number 기준(먼저 탐색이 끝난 node부터 삽입)으로 node를 담은 stack 생성
- Topological sort 결과 순서대로, source가 top에 위치하는 stack이 생김
- 2. 모든 edge들의 방향을 바꾼, 역방향 그래프 생성
- 3. stack의 top(기존 source)부터(pop) 역방향 그래프에서 DFS 수행
- 이미 다른 SCC에 들어간 노드는 탐색하지 않음
- DFS 끝날 때마다 하나의 SCC 생성
- DFS 끝나면 다시 stack에서 pop 후 DFS 수행, 이미 SCC에 포함된 노드는 skip
- 4. 완성!
- 시간 복잡도 O(V+E)
- Tarjan's Algorithm(책에는 없음)
- 좋은 예시
- 역방향 그래프 사용하지 않고, DFS 수행
- SCC의 부모 노드를 찾을 때까지 DFS 및 stack에 저장, 부모 노드를 찾으면 그 때까지 pop하고 SCC로 저장
- 시간 복잡도 O(V+E)
'다양한 이야기 > Algorithm 정리' 카테고리의 다른 글
Master theorem (0) | 2020.10.30 |
---|---|
[알고리즘] Chap.5 Greedy algorithm (0) | 2020.10.29 |
[알고리즘] Chap.6 Dynamic Programming (0) | 2020.10.28 |