코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,m,a,b,c,res,lst[1003];
vector<vector<int>> v;
int find(int x) {
if(x == lst[x]) return x;
return lst[x] = find(lst[x]);
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if(x > y) lst[x] = y;
else lst[y] = x;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> n;
cin >> m;
for(int i = 1; i < n + 1; i++) lst[i] = i;
for(int i = 0; i < m; i++) {
cin >> a >> b >> c;
v.push_back({c,a,b}); // 가중치를 0번에 배치
}
sort(v.begin(), v.end()); // 가중치가 낮은 것부터 연결할 것이므로 정렬
for(int i = 0; i < v.size(); i++) {
int pa,pb,pc;
pa = v[i][1];
pb = v[i][2];
pc = v[i][0];
if(find(pa) != find(pb)) { // 연결이 되어 있지 않으면
merge(pa, pb); // 합쳐주고 가중치를 더해줌
res += pc;
}
}
cout << res << '\n';
return 0;
}
모든 네트워크를 연결하는데, 최소 비용이 들어야 한다 했으므로 최소 스패닝 트리로 해결할 수 있다. 최소 스패닝 트리 중 크루스칼 알고리즘으로 해결했다. 예전 한화시스템 코테에 비슷한 유형이 나왔던 기억이 난다.
'백준' 카테고리의 다른 글
[백준] 1976번 여행 가자 C++ 코드 (0) | 2024.07.28 |
---|---|
[백준] 1647번 도시 분할 계획 C++ 코드 (0) | 2024.07.28 |
[백준] 1788번 피보나치 수의 확장 C++ 코드 (0) | 2024.07.28 |
[백준] 14494번 다이나믹이 뭐예요? C++ 코드 (0) | 2024.07.28 |
[백준] 19947번 투자의 귀재 배주형 C++ 코드 (0) | 2024.07.28 |