16562번: 친구비
첫 줄에 학생 수 N (1 ≤ N ≤ 10,000)과 친구관계 수 M (0 ≤ M ≤ 10,000), 가지고 있는 돈 k (1 ≤ k ≤ 10,000,000)가 주어진다. 두번째 줄에 N개의 각각의 학생이 원하는 친구비 Ai가 주어진다. (1 ≤ Ai ≤ 10,
www.acmicpc.net
코드
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
map<int, int> parent;
int f[10005];
long long ans = 0;
int Find(int x) {
if (x == parent[x]) return x;
return parent[x] = Find(parent[x]);
}
void Union(int v, int w) {
int pv = Find(v);
int pw = Find(w);
if (pv == pw) return;
f[pv] < f[pw] ? parent[pw] = pv : parent[pv] = pw;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int n, m, k;
cin >> n >> m >> k;
for (int i = 1; i <= n; i++) {
cin >> f[i]; parent[i] = i;
}
while (m--) {
int v, w;
cin >> v >> w;
Union(v, w);
}
for (int i = 1; i <= n; i++) {
if (i == parent[i]) ans += f[i];
}
if (ans > k) cout << "Oh no";
else cout << ans;
}
풀이
처음엔 다익스트라 방식으로만 고민, 문제 해결이 어려웠다.
분류가 분리 집합 문제임을 확인한 후, 분리 집합을 처음 접하였다.
분리 집합 (Union-Find)
- Union : 집합 여부 확인
- Find : 부모 확인 ( * 재귀를 통해 경로를 압축 )
'Problem Solving' 카테고리의 다른 글
C++) 백준 1759 암호 만들기 (0) | 2022.12.21 |
---|---|
C++) 백준 20055 컨베이어 벨트 위의 로봇 (0) | 2022.08.06 |
C++) 백준 4482 녹색 옷을 입은 애가 젤다지? (0) | 2022.08.03 |
C++) 백준 2015 수들의 합 4 (0) | 2022.08.03 |
C++) 백준 2470 두 용액 (0) | 2022.08.03 |