BOJ#1197 최소 스패닝 트리
* 문제
https://www.acmicpc.net/problem/1197
* 풀이
- MST(최소 스패닝 트리), 프림, 크루스칼 알고리즘, Union-Find 자료구조 설명
http://stack07142.tistory.com/54
- MST (Minimum Spanning Tree)를 구하는 방법으로 아래 2가지 알고리즘이 있습니다.
1) Prim's Algorithm, 프림
2) Kruskal Algorithm, 크루스칼
1197번 문제를 위 2가지 알고리즘으로 풀어보았습니다.
1. Prim's Algorithm, 프림
메모리 : 18848 KB, 시간 : 1244 MS
* 코드 해설
- 다익스트라 알고리즘과 비슷합니다.
- 그래프를 2개의 그룹으로 나눕니다. 하나는 MST 그룹, 하나는 V그룹
- 최초에는 당연히 V그룹만 있고, MST 그룹은 없겠죠?
- 프림 알고리즘에서는 시작점을 정해야 합니다. 시작점을 정하는 순간 MST 그룹은 정점이 1개 추가되는 것입니다.
- MST 그룹에서 인접한 V그룹의 정점까지의 거리(d 배열)를 갱신해줍니다. 그리고 d배열값이 가장 작은, 가장 가까운 V그룹의 정점을 MST 그룹의 다음 정점으로 선택하는 것입니다.
2. Kruskal Algorithm, 크루스칼
메모리 : 14148 KB, 시간 : 484 MS
* 코드 해설
- 간선의 weight를 기준으로 간선들을 정렬해야 하므로 우선순위 큐에 Edge 객체들을 넣어 주었습니다.
- Edge 객체들을 비교하려면 Comparable을 implements 해야 합니다.
(어떻게 비교해야 하는지 모르기 때문에 compareTo 함수를 오버라이드 해서 구현해줍니다.)
- while loop의 (edgeNumOfMST < V) 조건
: 최소 스패닝 트리의 조건은 (정점의 수 - 1 = 간선의 수) 입니다.
* 나의 코드
https://github.com/stack07142/BOJ/tree/master/BOJ%231197_MST
'Algorithm > MST' 카테고리의 다른 글
BOJ#2887 행성 터널 (0) | 2017.05.17 |
---|---|
BOJ#13418 학교 탐방하기 (0) | 2016.12.05 |