일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 정렬알고리즘
- 프로그래머스
- 알고리즘
- map
- 데이터애셋
- 애셋로드
- dataasset
- 델리게이트
- 자료구조
- 강참조
- stl
- 선택정렬
- UML관련
- enumasByue
- moreeffectiveC++
- 정렬
- 약참조
- 스마트포인터
- 언리얼엔진구조체
- 람다사용정렬
- UELOG
- UE_LOG
- 언리얼가비지컬렉터
- BFS
- unorder_map
- UE4 커스텀로그
- 람다
- C++최적화
- C++
- 크리티컬섹션
- Today
- Total
기억을 위한 기록들
[알고리즘]프림 알고리즘(Prim'a Algorithm) 본문
최소 신장 트리를 만들어 내는 과정
1. 그래프와 최소 신장 트리를 준비. 이때의 최소 신장트리는 노드가 하나도 없는 상태
2. 그래프에서 임의의 정점을 시작 정점으로 선택하여 최소 신장 트리의 루트 노드로 삽입한다.
3. 삽입되어 있는 정점들과 모든 인접 정점 사이에 있는 간선의 가중치를 조사. 간선 중 가장 가중치가 작은 것을 골라 이 간선에 연결되어 있는 인접 정점을 최소 신장트리에 삽입. 단, 새로 삽입되는 정점은 최소 신장트리에 삽입되어 있는 기존의 노드들과 사이클을 형성 하면 안됨.
4. 3의 과정을 반복하다가 최소 신장 트리가 그래프의 모든 정점을 연결하게 되면 알고리즘 종료
예제
위와 같은 그래프가 있다.
여기서 임의의 정점 B를 시작으로 루트로 정해보자.
그 주위에 정점 A F C 로 가는 간선 가중치 중 가장 작은 35 A와 연결 해준다.
그 다음으로 A-E / B-F / B-C 중 가장 적은 가중치 126을 가진 C와 연결해준다.
그다음 으로 작은 C-D 117과 연결해주고, F와 C는 사이클이 형성됨으로 제외 되고 그 F 와 근접한 E 와 D H 중 가장 작은 E와 연결이 된다. 이런식으로 사이클 형성은 되지 않으며 가장 작은 가중치 값들을 이어 나간다.
이렇게 하여 최소 신장트리가 완성 되었다.
사용 할수 있는 자료 구조 : 배열/링크드리스트/ 트리/ 그래프
최소 가중치를 골라내는 과정에서 발생하는 성능 문제가 제법 심각하다. 해결하는 방법으로는 정점이 추가 될 때마다 조사 대상 간선 정렬하기와 이진 탐색트리에 조사 대상 간선 입력하기 등이 있겠지만, 우선순위 큐 사용이 삽입 삭제과 빠르며 최소값 찾는데 비용이 거의 들지 않으므로 추천한다.
'자 & 알 > 알고리즘' 카테고리의 다른 글
[알고리즘] 최단 경로찾기 ? 다익스트라 알고리즘 (Dijkstra Algorithm) (0) | 2021.01.27 |
---|---|
[알고리즘]크루스칼 알고리즘(Kruskal's Algorithm) (0) | 2021.01.27 |
[알고리즘] 플러드 필(Flood Fill) 알고리즘? (0) | 2021.01.11 |
[알고리즘] 위상정렬(Topological Sort) (0) | 2021.01.06 |
[알고리즘] 그래프 탐색 2가지 - 깊이 우선 탐색(Depth First Search) & 너비우선탐색(Breadth First Search)/ C++ 구현 (0) | 2021.01.06 |