Algorithm/MST

BOJ#1197 최소 스패닝 트리

밤이2209 2016. 12. 4. 21:54

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