본문 바로가기
알고리즘/백준 & swacademy

BOJ 16562 - 친구비

by sun__ 2019. 8. 6.

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