코드
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int n,m,lst[100003],a,b,c,res,mn;
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 >> 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});
}
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;
mn = max(mn,pc); // 연결된 길 중 가장 가중치가 큰 값 구하기
}
}
cout << (res-mn) << '\n'; // 가장 큰 값을 빼주면 마을 2개가 완성된다.
return 0;
}
도시 분할을 하려고 하는데, 모든 마을이 최소 비용으로 연결되어있으면서 2개로 나누려고 한다. 이때 마을 간의 길은 없도록 한다. 이는 최소 스패닝 트리로 가중치를 구하고, 연결된 길 중 가중치가 가장 큰 값을 빼주면 답을 구할 수 있다.
'백준' 카테고리의 다른 글
[백준] 20040번 사이클 게임 C++ 코드 (0) | 2024.07.28 |
---|---|
[백준] 1976번 여행 가자 C++ 코드 (0) | 2024.07.28 |
[백준] 1922번 네트워크 연결 C++ 코드 (0) | 2024.07.28 |
[백준] 1788번 피보나치 수의 확장 C++ 코드 (0) | 2024.07.28 |
[백준] 14494번 다이나믹이 뭐예요? C++ 코드 (0) | 2024.07.28 |