[프로그래머스] 섬 연결하기
프로그래머스의 Lv.3 섬 연결하기입니다.
문제 출처
문제 해설
문제의 핵심을 요약해보자.
- 섬의 개수는 1개 이상 100개 이하이다.
- 섬을 연결하는 다리가 있고, 해당 다리에는 비용이 있다.
- 모든 섬을 서로 통행 가능하도록 다리를 만들 때, 최소비용을 구해야한다.
위의 요약에 따라 생각해보면, 이 문제는 최소 신장 트리 문제이다.
나는 최소 신장 트리에서도 프림 알고리즘을 사용해서 문제를 해결했다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <bits/stdc++.h>
using namespace std;
bool check[101];
int solution(int n, vector<vector<int>> costs) {
int answer = 0;
int startPoint = 0;
vector<pair<int, int>> v[101];
for(int i=0;i<costs.size();++i){
int start = costs[i][0];
int end = costs[i][1];
int cost = costs[i][2];
v[start].push_back({end, cost});
v[end].push_back({start,cost});
startPoint = start;
}
priority_queue<tuple<int,int,int>
, vector<tuple<int,int,int>>
, greater<tuple<int,int,int>>> pq;
check[startPoint] = true;
for(auto cur : v[startPoint]){
pq.push({cur.second, startPoint, cur.first});
}
int count = 1;
while(count < n){
int cost, start, end;
tie(cost, start, end) = pq.top(); pq.pop();
if(check[end] == true) continue;
check[end] = true;
answer += cost;
++count;
for(auto a : v[end]){
if(check[a.first] == false)
pq.push({a.second, end, a.first});
}
}
return answer;
}
This post is licensed under CC BY 4.0 by the author.