https://www.acmicpc.net/problem/16562
16562번: 친구비
첫 줄에 학생 수 N (1 ≤ N ≤ 10,000)과 친구관계 수 M (0 ≤ M ≤ 10,000), 가지고 있는 돈 k (1 ≤ k ≤ 10,000,000)가 주어진다. 두번째 줄에 N개의 각각의 학생이 원하는 친구비 Ai가 주어진다. (1 ≤ Ai ≤ 10,000, 1 ≤ i ≤ N) 다음 M개의 줄에는 숫자 v, w가 주어진다. 이것은 학생 v와 학생 w가 서로 친구라는 뜻이다.
www.acmicpc.net
유니온파인드 문제다. 각 집합의 최소를 모두 더한 합을 출력하면 된다.
#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 |