반응형
최소 스패닝 트리로 모든 집을 연결하고, 여기서 가장 유지비가 비싼 길을 하나만 끊어낸다면,
마을을 두 개로 분리하면서 최소 비용으로 필요한 길만 유지할 수 있습니다.
#include <iostream>
#include <algorithm>
#include <vector>
#define MAX 100001
using namespace std;
typedef pair<int, int> pii;
typedef pair<int, pii> piii;
int n, m, a, b, c;
vector<piii> edges;
int p[MAX];
int findParent(int x) {
if (p[x] == 0) return x;
else return p[x] = findParent(p[x]);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n >> m;
for (int i = 0; i < m; i++) {
cin >> a >> b >> c;
edges.push_back({ c, {a, b} });
}
sort(edges.begin(), edges.end());
int s = 0, cnt = 0;
for (auto& edge : edges) {
int pa = findParent(edge.second.first);
int pb = findParent(edge.second.second);
if (pa != pb) {
p[pa] = pb;
s += edge.first;
if (++cnt == n - 2) break;
}
}
cout << s;
}
반응형
'Algorithm' 카테고리의 다른 글
백준 2866 : 문자열 잘라내기 (0) | 2021.11.11 |
---|---|
백준 10546 : 배부른 마라토너 (0) | 2021.11.11 |
백준 1700 : 멀티탭 스케줄링 (0) | 2021.11.11 |
백준 9576 : 책 나눠주기 (0) | 2021.11.11 |
백준 16234 : 인구 이동 (0) | 2021.11.11 |