Notice
Recent Posts
Recent Comments
Link
알고리즘 모음(C++)
백준 16562 - 친구비(C++) 본문
문제 링크입니다. https://www.acmicpc.net/problem/16562
Union-Find로 풀 수 있는 문제입니다.
BFS를 사용해서 풀 수 있는 문제이기도 합니다. 저는 BFS를 이용해 푸는 방법을 설명해드리겠습니다.
자세한 것은 코드를 참고해주세요
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <algorithm>
using namespace std;
int N, M, K;
int cost[10001];
vector<int> connect[10001];
int check[10001];
vector<int> Friend[10001];
bool cmp(int x, int y) {
if (cost[x] < cost[y]) return true;
else return false;
}
void bfs(int start, int line) {
queue<int> q;
q.push(start);
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 0; i < connect[x].size(); i++) {
int xx = connect[x][i];
if (check[xx] == 0) {
check[xx] = 1;
Friend[line].push_back(xx);
q.push(xx);
}
}
}
}
void solve() {
int line = 0;
int require_cost = 0;
for (int i = 1; i <= N; i++) {
if (check[i] == 0) {
check[i] = 1;
Friend[line].push_back(i);
bfs(i, line);
line++;
}
}
for (int i = 0; i < line; i++) {
sort(Friend[i].begin(), Friend[i].end(), cmp);
require_cost += cost[Friend[i][0]];
}
if (K >= require_cost) cout << require_cost;
else cout << "Oh no";
}
int main()
{
cin.tie(0);
cout.tie(0);
cin >> N >> M >> K;
for (int i = 1; i <= N; i++) cin >> cost[i];
for (int i = 1; i <= M; i++) {
int x, y;
cin >> x >> y;
connect[x].push_back(y);
connect[y].push_back(x);
}
solve();
return 0;
}
질문 및 조언 댓글 남겨주세요
'백준' 카테고리의 다른 글
백준 3187 - 양치기 꿍(C++) (0) | 2022.05.21 |
---|---|
백준 11085 - 군사 이동(C++) (0) | 2022.05.18 |
백준 2960 - 에라토스테네스의 체(C++) (0) | 2022.05.16 |
백준 1854 - K번째 최단경로 찾기(C++) (0) | 2022.05.16 |
백준 1162 - 도로포장(C++) (0) | 2022.05.14 |