https://www.acmicpc.net/problem/16562
유니온파인드 문제다. 각 집합의 최소를 모두 더한 합을 출력하면 된다.
#include <iostream>
#include <algorithm>
using namespace std;
int n, m, k;
int uf[10001];
int cost[10001];
int rst[10001];
int find(int a) {
if (uf[a] == a) return a;
return uf[a] = find(uf[a]);
}
bool merge(int a, int b) {
a = find(a);
b = find(b);
if (a == b) return false;
uf[a] = b;
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
cin >> cost[i];
uf[i] = i;
}
for (int i = 0,u,v; i < m; i++) {
cin >> u >> v;
merge(u - 1, v - 1);
}
fill(rst, rst + n, 1e9);
for (int i = 0; i < n; i++) rst[find(i)] = min(rst[find(i)],cost[i]);
int sum = 0;
for (int i = 0; i < n; i++) {
if (rst[i] >= 1e9) continue;
sum += rst[i];
}
if (sum <= k) cout << sum << '\n';
else cout << "Oh no\n";
}
왜 리뷰하라고 메모해뒀지..?
'알고리즘 > 백준 & swacademy' 카테고리의 다른 글
BOJ 12015 - 가장 긴 증가하는 부분수열2 (segtree) (0) | 2019.08.19 |
---|---|
BOJ 3745 - 오름세 (0) | 2019.08.06 |
BOJ 2075 - N번째 큰 수 (0) | 2019.08.06 |
BOJ 1351 - 무한 수열 (0) | 2019.08.06 |
BOJ 1949 - 우수마을 (0) | 2019.08.06 |