풀이과정
크루스칼 알고리즘의 대표적인 문제다.
두 개의 마을로 나눠야 하니까 마지막 간선(가장 가중치가 큰 간선) 을 안 더해주면 된다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N, M, A, B, C;
int parent[100001];
vector <pair <int, pair <int, int>>> v;
int getParent(int x) {
if (x == parent[x]) return x;
return parent[x] = getParent(parent[x]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
for(int i = 0; i < M; i++){
cin >> A >> B >> C;
v.push_back({ C, {A, B} });
}
sort(v.begin(), v.end());
int sum = 0;
int cnt = 0;
for (int i = 0; i < M; i++) {
int cost = v[i].first;
int start = v[i].second.first;
int end = v[i].second.second;
int a = getParent(start);
int b = getParent(end);
if (a == b) continue;
if (a < b) parent[b] = a;
else parent[a] = b;
sum += cost;
cnt++;
if (cnt == N - 2) {
cout << sum;
break;
}
}
}
'🍞 Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 1005 ACM Craft c++ (0) | 2022.09.02 |
---|---|
[백준] 1449 수리공 항승 c++ (0) | 2022.09.02 |
[백준] 1197 최소 스패닝 트리 c++ (0) | 2022.09.02 |
[백준] 17396 백도어 c++ (0) | 2022.09.02 |
[백준] 10757 큰 수 A+B c++ (0) | 2022.09.02 |