반응형
문제
풀이
크루스칼 알고리즘을 이용합니다.
1. 간선들을 가중치 기준 오름차순으로 정렬합니다.
2. 간선의 시작과 끝이 연결되지 않았다면 (부모가 같지 않다면) 연결하고 가중치를 더해줍니다.
2-1. 시작과 끝이 연결된 경우에는 해당 간선은 연결할 필요가 없으므로 무시합니다.
3. 간선 배열을 모두 확인해 준 뒤 답을 출력합니다.
소스 코드
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int Parent[10001];
struct Edge
{
// 가중치, 시작, 끝
int weight;
int u;
int v;
};
// 부모 찾기
int Find(int x) {
if (Parent[x] == x)
return x;
else
return Parent[x] = Find(Parent[x]);
}
// 합치기
void Union(int x, int y) {
x = Find(x);
y = Find(y);
if (x != y)
Parent[y] = x;
}
// 부모가 같은지 확인
bool IsSameParent(int x, int y) {
x = Find(x);
y = Find(y);
if (x != y)
return false;
else
return true;
}
// 가중치 기준으로 오름차순 정렬
int myCompare(Edge& a, Edge& b)
{
return a.weight < b.weight;
}
int main()
{
ios_base::sync_with_stdio(false);
// 입력
vector<Edge> v;
int V, E;
long long ans = 0;
cin >> V >> E;
for (int i = 0; i < V; i++)
{
Parent[i] = i;
}
int a, b, cost;
for (int i = 0; i < E; i++) {
cin >> a >> b >> cost;
v.push_back({ cost, a, b });
}
// 가중치 기준으로 오름차순 정렬
sort(v.begin(), v.end(), myCompare);
for (int i = 0; i < v.size(); i++) {
// u, v가 연결되지 않았을 경우(같은 부모가 아닐경우) 연결해주고 가중치 증가
if (IsSameParent(v[i].u, v[i].v) == false)
{
Union(v[i].u, v[i].v);
ans += v[i].weight;
}
}
cout << ans;
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 1806] 부분합 C++ (0) | 2021.10.25 |
---|---|
[백준 3055] 탈출 C++ (0) | 2021.10.21 |
[백준 1520] 내리막 길 C++ (0) | 2021.10.17 |
[백준 14499] 주사위 굴리기 C++ (0) | 2021.10.13 |
[백준 1717] 집합의 표현 C++ (0) | 2021.10.11 |