Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 4386 별자리 만들기 본문

Programming/BOJ

[백준/BOJ] 4386 별자리 만들기

he1fire 2020. 9. 22. 13:46
728x90

문제 : 4386 별자리 만들기

 

4386번: 별자리 만들기

도현이는 우주의 신이다. 이제 도현이는 아무렇게나 널브러져 있는 n개의 별들을 이어서 별자리를 하나 만들 것이다. 별자리의 조건은 다음과 같다. 별자리를 이루는 선은 서로 다른 두 별을 일�

www.acmicpc.net

별들의 좌표가 주어졌을 때 각 별들을 모두 잇는

최소 길이를 구해 출력하는 문제이다.

최소 스패닝 트리를 구해야 하므로 UnionFind를 짜고

각 간선에 이어진 점과 간선의 비용을 우선순위 큐에 넣어

가장 적은 비용부터 꺼내며 사이클이 생기지 않게 처리해주면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
typedef pair<double,double> pdd;
struct ABC{
    ll a, b;
    double x;
    ABC(){}
    ABC(ll a, ll b, double x): a(a), b(b), x(x){}
};
bool operator<(ABC a, ABC b){
    return a.x > b.x;
}
ll N, MST[105];
double ans=0;
vector<pdd> arr;
priority_queue<ABC> pq;
ll Find(ll x){
    if (x==MST[x]) return x;
    return MST[x]=Find(MST[x]);
}
void Union(ll x, ll y){
    MST[Find(x)]=Find(y);
}
int main(){
    cin >> N;
    for (int i=0;i<100;i++){
        MST[i]=i;
    }
    for (int i=0;i<N;i++){
        double a, b;
        cin >> a >> b;
        arr.push_back({a,b});
    }
    for (int i=0;i<N;i++){
        for (int j=i+1;j<N;j++){
            double len=sqrt(pow(arr[i].first-arr[j].first,2)+pow(arr[i].second-arr[j].second,2));
            pq.push(ABC(i,j,len));
        }
    }
    while (!pq.empty()){
        ABC now=pq.top();
        pq.pop();
        if (Find(now.a)==Find(now.b))
            continue;
        Union(now.a,now.b);
        ans+=now.x;
    }
    printf("%.2f", ans);
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 4811 알약  (0) 2020.09.22
[백준/BOJ] 13703 물벼룩의 생존 확률  (0) 2020.09.22
[백준/BOJ] 14890 경사로  (0) 2020.09.22
[백준/BOJ] 1057 토너먼트  (0) 2020.09.21
[백준/BOJ] 14889 스타트와 링크  (0) 2020.09.21
Comments