PS

BOJ 16398 : 행성 연결

lickelon 2024. 4. 29. 16:38

코드

#include <bits/stdc++.h>

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
using edge = pair<ll, pii>;

int parent[1001];

int find(int a)
{
    if(parent[a] == a) return a;
    return parent[a] = find(parent[a]);
}

void merge(int a, int b)
{
    a = find(a);
    b = find(b);
    if(a == b) return;
    parent[a] = b;
}

bool iscycle(int a, int b) {
    a = find(a);
    b = find(b);
    return a == b;
}

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

    int n;
    cin >> n;

    vector<edge> arr;

    for(int i = 1; i <= n; i++) {
        parent[i] = i;
    }

    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            ll c;
            cin >> c;
            if(i > j) {
                arr.emplace_back(make_pair(c, make_pair(i, j)));
            }
        }
    }

    sort(arr.begin(), arr.end());

    ll ans = 0;
    for(int i = 0; i < arr.size(); i++) {
        if(!iscycle(arr[i].second.first, arr[i].second.second)) {
            merge(arr[i].second.first, arr[i].second.second);
            ans += arr[i].first;
        }
    }

    cout << ans;
    return 0;
}

풀이

MST 기본문제이다.

'PS' 카테고리의 다른 글

BOJ 1916 : 최소비용 구하기  (1) 2024.05.01
BOJ 26216 : 은나무  (0) 2024.04.30
BOJ 5696 : 숫자 세기  (0) 2024.04.28
BOJ 28137 : 뭐라고? 안들려  (0) 2024.04.27
BOJ 2778 : 측량사 지윤  (0) 2024.04.26