출처 : https://www.acmicpc.net/problem/16562
풀이 방법
간단한 bfs문제이다.
친구의 친구도 친구, 친구의 친구의 친구도 친구 이므로 bfs를 통해 친구 그룹을 만든 후 그 친구들 중 친구비가 가장 작은 값을 구해서 더해주면 된다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <memory.h>
#include <queue>
using namespace std;
int N, M, K;
vector<int> money;
vector<vector<int> > f;
int visited[10001];
int bfs(int idx) {
int min_money = money[idx]; // 현재 친구 그룹에서 가장 작은 값
queue<int> q;
q.push(idx);
visited[idx] = 1;
while(!q.empty()) {
int now = q.front();
q.pop();
for (int i = 0;i < f[now].size();i++) {
int next = f[now][i];
if (visited[next] == 0) {
q.push(next);
visited[next] = 1;
min_money = min(min_money, money[next]);
}
}
}
return min_money;
}
int main() {
cin >> N >> M >> K;
memset(visited, 0, sizeof(visited));
money.push_back(0); // 인덱스를 위한 가비지 값 채워 넣기
f.resize(N+1);
for (int i = 0;i < N;i++) { //친구 비 입력 인덱스는 1부터 시작한다.
int a;
cin >> a;
money.push_back(a);
}
for (int i = 0;i < M;i++) { //친구 관계 입력 받기
int a, b;
cin >> a >> b;
f[a].push_back(b);
f[b].push_back(a);
}
// bfs를 돌며 그룹 묶기 그 중 친구비가 가장 싼 친구랑 친구하기
int ans = 0;
for (int i = 1;i < N+1;i++) {
if(visited[i] == 0) {
ans += bfs(i);
}
}
if (ans > K) {
cout << "Oh no";
}
else {
cout << ans;
}
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준] 경사로 14890 (c++) 구현 (0) | 2024.10.02 |
---|---|
[백준] 퇴사 2 15486번 (c++) dp 최댓값으로 갱신하기 (1) | 2024.10.01 |
[백준] 미로만들기 2662번 (c++) bfs, 우선순위 큐 (0) | 2024.09.23 |
[백준] 감시 15683번 (c++) 구현, 배열 선언 위치의 중요성 (0) | 2024.09.22 |
[프로그래머스] H-Index (c++) 정렬 (0) | 2024.09.20 |