[백준] 16562번 친구비 (C++)

2025. 8. 20. 19:35·Algorithm
728x90

https://www.acmicpc.net/problem/16562

 

 

이 문제는 친구들의 관계에 대한 그래프가 주어지고 각 친구에 대한 친구비용이 주어졌을때

N명의 학생들이 모두 친구가 되기 위해서 최소 비용을 출력하는 문제이다.

 

1. 친구들의 관계가 주어진다. -> 그래프 형태로 표현 가능하다.

2. 최소비용을 출력하라 -> 친구 관계에서 루트 노드를 비용이 가장 작은 친구로 두어야한다.

 

유니온 파인드 알고리즘을 사용하여 각 그래프에서 루트 부분을 가장 작은 비용이 드는 친구를 선택하여 만들어

 

set에 부모노드를 넣어 합하면 최소비용이 만들어진다.

 

 

정답코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 1e9

struct coordinate {
    int x;
    string s;
    vector<int> v;
};

int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int N, M, K;
int friendCost[10001];
int unf[10001];

int Find(int a) {
    if(a == unf[a]) return a;
    return unf[a] = Find(unf[a]);		// 좌표 압축
}

void Union(int a, int b) {		// 비용이 가장 적은 친구를 루트로 만듬
    a = Find(a);
    b = Find(b);

    if(friendCost[a] > friendCost[b]) {
        unf[a] = b;
    }
    else unf[b] = a;
}

bool isUnion(int a, int b) {
    a = Find(a);
    b = Find(b);

    if(a == b) return true;
    else return false;
}

void Init() {
    for(int i = 1; i <= N; i++) {
        unf[i] = i;			// 초기에 자기 자신을 루트로 설정
    }
}

void solve() {
    set<int> st;

    for(int i = 1; i <= N; i++) {
        st.insert(Find(unf[i]));
    }

    int cost = 0;

    for(auto it : st) {
        cost += friendCost[it];
    }

    if(cost <= K) {
        cout << cost;
    }
    else cout << "Oh no";
}

void input() {
    cin >> N >> M >> K;

    Init();

    for(int i = 1; i <= N; i++) {
        cin >> friendCost[i];
    }

    for(int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        Union(a, b);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();

    return 0;
}

 

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 3055번 탈출 (C++)  (0) 2025.08.22
[백준] 11559번 Puyo Puyo (C++)  (0) 2025.08.21
[백준] 16724번 피리 부는 사나이 (C++)  (0) 2025.08.19
[백준] 11497번 통나무 건너뛰기 (C++)  (0) 2025.08.18
[백준] 10775번 공항 (C++)  (0) 2025.08.17
'Algorithm' 카테고리의 다른 글
  • [백준] 3055번 탈출 (C++)
  • [백준] 11559번 Puyo Puyo (C++)
  • [백준] 16724번 피리 부는 사나이 (C++)
  • [백준] 11497번 통나무 건너뛰기 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (285) N
      • Programming (52) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (8) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2) N
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    시뮬레이션
    정렬
    WebSecurity
    DP
    구현
    그리디
    BFS
    c언어
    Bandit
    깊이우선탐색
    누적합
    투포인터
    코딩
    우선순위 큐
    wargame
    백준
    다이나믹 프로그래밍
    linux
    그래프 이론
    트리
    브루트포스
    DFS
    비트마스킹
    이분탐색
    에라토스테네스의 체
    Leviathan
    우선순위큐
    백트래킹
    재귀
    다익스트라
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 16562번 친구비 (C++)
상단으로

티스토리툴바