1. 신장 트리
- 그래프에서 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미함.
- 모든 노드가 포함되어 서로 연결되면서 사이클이 존재하지 않는다는 조건은 트리의 조건이 됨.
2. 최소 신장 트리
- 최소한의 비용으로 구성되는 신장 트리를 찾아야 할 때 어떻게 해야 할까요?
- N개의 도시가 존재하는 상황에서 두 도시 사이에 도로를 놓아 전체 도시가 서로 연결될 수 있게 도로를 설치하는 경우 => 두 도시 A,B를 선택했을 때 A에서 B로 이동하는 경로가 반드시 존재하도록 도로를 설치합니다.
3. 크루스칼 알고리즘
- 대표적인 최소 신장 트리 알고리즘
- 그리디 알고리즘으로 분류
- 구체적인 동작 과정
- 1. 간선 데이터를 비용에 따라 오름차순으로 정렬
- 2. 간선을 하나씩 확인하며 현재의 간선이 사이클을 발생시키는지 확인함.
- 2-1) 사이클이 발생하지 않는 경우 최소 신장 트리에 포함 시킴
- 2-2) 사이클이 발생하는 경우 최소 신장 트리에 포함시키지 않음.
- 3. 모든 간선에 대해 2번의 과정 반복.
4. 크루스칼 알고리즘 : 동작 과정
- [초기 단계] 그래프의 모든 간선 정보에 대하여 오름차순 정렬을 수행.
- [Step1] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (3, 4)을 선택하여 처리.
- [Step2] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (4, 7)을 선택하여 처리.
- [Step3] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (4, 6)을 선택하여 처리.
- [Step4] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (6, 7)을 선택하여 처리.
- [Step5] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (1, 2)을 선택하여 처리.
- [Step6] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (2, 6)을 선택하여 처리.
- [Step7] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (2, 3)을 선택하여 처리.
- [Step8] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (5, 6)을 선택하여 처리.
- [Step9] 아직 처리하지 않은 간선 중에서 가장 짧은 간선인 (1, 5)을 선택하여 처리.
- [알고리즘 수행 결과]
- 최소 신장 트리에 포함되어 있는 간선의 비용만 모두 더하면, 그 값이 최종 비용에 해당.
5. 코드 구현 (C++)
6. 크루스칼 알고리즘 성능 분석
- 크루스칼 알고리즘은 간선의 개수가 E개 일 때, O(ElogE)의 시간 복잡도를 가짐.
- 크루스칼 알고리즘에서 가장 많은 시간을 요구하는 곳은 간선을 정렬을 수행하는 부분임.
- 표준 라이브러리를 이용해 E개의 데이터를 정렬하기 위한 시간 복잡도는 O(ElogE)이기 때문.
'자료구조 C++' 카테고리의 다른 글
위상 정렬 (0) | 2021.04.12 |
---|---|
그리디 알고리즘 (0) | 2021.03.05 |
DFS와 BFS (0) | 2021.02.24 |
동적 프로그래밍(Dynamic Programming) - DP (0) | 2021.02.13 |
9. 우선 순위 큐 (Heap) (0) | 2021.02.07 |