본문 바로가기

Coding Test

백준 1774 우주신과의 교감

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

 

1774번: 우주신과의 교감

(1,1) (3,1) (2,3) (4,3) 이렇게 우주신들과 황선자씨의 좌표가 주어졌고 1번하고 4번이 연결되어 있다. 그렇다면 1번하고 2번을 잇는 통로를 만들고 3번하고 4번을 잇는 통로를 만들면 신들과 선자씨끼

www.acmicpc.net

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

#define INF 987654321

using namespace std;


//우주신들의 좌표
pair<int, int> god[1000001];

//{dist, v}
vector<pair<double, pair<int, int>>> edge;
int parent[1001];


int findParent(int k){


    return parent[k] == k ? k : parent[k] = findParent(parent[k]);
}

bool isSame(int a, int b){

    return findParent(a) == findParent(b);

}

void mg(int a, int b){



    int pa = findParent(a);
    int pb = findParent(b);

    if (pa < pb) {
        parent[pb] = pa;
    } else {
        parent[pa] = pb;
    }


}


int main() {

    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cout << fixed;
    cout.precision(2);


    int n, m;
    double ans = 0;



    cin >> n >> m;




    //우주신들의 좌표
    for (int i = 1; i <= n; i++) {

        cin >> god[i].first >> god[i].second;


    }

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

    //이미 연결된 통로
    for (int i = 0; i < m; i++) {

        int a, b;

        cin >> a >> b;

        //이미 연결되어 있는 통로는 union 처리를 해주어 연결을 방지
        if (!isSame(a, b)) {
            mg(a, b);

        }


    }


    //모든 우주선 간의 거리 구하기
    for (int i = 1; i < n; i++) {
        for (int j = i + 1; j <= n; j++) {

            double dist = sqrt(pow(god[j].first - god[i].first, 2) + pow(god[j].second - god[i].second, 2));

            edge.push_back({dist, {i, j}});
        }
    }



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



    for (int i = 0; i < edge.size(); i++) {


        if (!isSame(edge[i].second.first, edge[i].second.second)) {
            mg(edge[i].second.first, edge[i].second.second);
            ans += edge[i].first;

        }

    }


    cout << ans;





    return 0;
}

 

문장만 보면 헷갈려 보이지만 edge의 weight를 하는 과정이 포함되었을 뿐인 mst 문제이다

 

4개의 vertex가 있는 데 그 중 1-4가 연결되어 있고 이 외의 나머지 선을 최소 길이로 그리는 문제이다.

 

우선 이미 연결된 선을 입력 받을 때 그 edge에 속한 두 노드를 union한다.

그렇게 되면 이 다음 kruscal 알고리즘 과정에서 부모 노드가 같으므로 연결을 제외한다.

그 외 나머지 모든 노드들을 확인하면서 부모가 다르면 연결하는 방식으로 해결하였다.

'Coding Test' 카테고리의 다른 글

백준 1277 발전소 설치  (0) 2024.03.27
백준 16139 인간-컴퓨터 상호작용  (0) 2024.03.26
백준 21919 소수 최소 공배수  (1) 2024.03.25
백준 17276 배열 돌리기  (1) 2024.03.23
백준 11000 강의실 배정  (0) 2024.03.22