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
47
48
49
50
51
52
53
54
55
56
| // cost가 작은순으로 정렬
bool comp(const vector<int>& a, const vector<int>& b){
return a[2] < b[2];
}
// 부모노드 찾기
int getParent(vector<int>& parent, int node){
if(parent[node] == node)
return node;
return parent[node] = getParent(parent, parent[node]);
}
// 작은 부모노드의 번호로 합치기
void unionParent(vector<int>& parent, int a, int b){
a = getParent(parent, a);
b = getParent(parent, b);
int max = a > b ? a : b;
int min = a <= b ? a : b;
parent[max] = min;
}
// 부모노드 검사를 통해 사이클이 이루어지는지 검사
bool checkCycle(vector<int>& parent, int a, int b){
a = getParent(parent, a);
b = getParent(parent, b);
if(a == b)
return true;
else
return false;
}
int solution(int n, vector<vector<int>> costs) {
int answer = 0;
vector<vector<int>> g(n, vector<int>(n, 0));
vector<int> parent(n, 0);
for(auto i = 0 ; i < n ; ++i)
parent[i] = i;
sort(costs.begin(), costs.end(), comp);
// kruskal 알고리즘을 통해
// minimum spanning tree(MST)를 구함
for(auto i = 0 ; i < costs.size() ; ++i){
if(!checkCycle(parent, costs[i][0], costs[i][1])){
answer += costs[i][2];
unionParent(parent, costs[i][0],costs[i][1]);
}
}
return answer;
}
|