알고리즘 모음(C++)

백준 1774 - 우주신과의 교감(C++) 본문

백준

백준 1774 - 우주신과의 교감(C++)

공대생의 잡다한 사전 2021. 7. 26. 01:36

문제 링크입니다 https://www.acmicpc.net/problem/1774

 

1774번: 우주신과의 교감

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

www.acmicpc.net

 

문제 조건
출력 예시

간단한 MST 문제였습니다. 본격적인 쿠르스칼 알고리즘을 실행하기 전에 연결되어 있는 지점들을 연결해주고 시작하는게 포인트였습니다.

 

    for (int i = 0; i < num_link; i++) {
        int x, y;
        cin >> x >> y;
        Union(x, y);
    }

연결되어 있는 지점을 입력 받은 뒤에 Union함수를 통해서 연결해줬습니다. 

 

    for (int i = 0; i < num; i++) {
        for (int j = i + 1; j < num; j++) {
            double x_distance = abs(place[i].first - place[j].first);
            double y_distance = abs(place[i].second - place[j].second);
            double distance = sqrt(x_distance * x_distance + y_distance * y_distance);
            planet.push_back({ i + 1, j + 1, distance });
        }
    }

1번 지점부터 N번까지 하나하나 거리를 계산해서 입력해줬습니다. abs와 sqrt를 이용해 쉽게 계산했습니다.

 

Union + Find 를 통해서 한 지점이 어디까지 연결되어있는지를 찾은뒤에 연결해줬습니다.

 

 

자세한 것은 코드를 참고해주세요!

 

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <cmath>
using namespace std;

vector<pair<double, double>> place;
typedef struct li {
    int start;
    int finish;
    double cost;
}li;
vector<li> planet;
int num, num_link;
int connect[1001];

bool cmp(li a, li b) {
    if (a.cost < b.cost) return true;
    return false;
}

int Find(int x) {
    if (connect[x] == x) return x;
    else return connect[x] = Find(connect[x]);
}

void Union(int x, int y) {
    int xx = Find(x);
    int yy = Find(y);
    connect[xx] = yy;
}

void solve() {
    double cost_mini = 0;
    for (int i = 0; i < num; i++) {
        for (int j = i + 1; j < num; j++) {
            double x_distance = abs(place[i].first - place[j].first);
            double y_distance = abs(place[i].second - place[j].second);
            double distance = sqrt(x_distance * x_distance + y_distance * y_distance);
            planet.push_back({ i + 1, j + 1, distance });
        }
    }
    sort(planet.begin(), planet.end(), cmp);
    for (int i = 0; i < planet.size(); i++) {
        int x = Find(planet[i].start);
        int y = Find(planet[i].finish);
        if (x != y) {
            Union(x, y);
            cost_mini += planet[i].cost;
        }
    }
    printf("%.2f", cost_mini);
}

int main()
{
    cin.tie(0);
    cout.tie(0);
    cin >> num >> num_link;
    for(int i = 0; i < num; i++){
        double x, y;
        cin >> x >> y;
        place.push_back(make_pair(x, y));
    }
    for (int i = 0; i < 1001; i++) connect[i] = i;
    for (int i = 0; i < num_link; i++) {
        int x, y;
        cin >> x >> y;
        Union(x, y);
    }
    solve();
    return 0;
}

 

질문 및 조언 댓글 남겨주세요!

'백준' 카테고리의 다른 글

백준 2887 - 행성 터널(C++)  (0) 2021.07.29
백준 14621 - 나만 안되는 연애(C++)  (0) 2021.07.27
백준 16398 - 행성 연결(C++)  (0) 2021.07.25
백준 4386 - 별자리 만들기  (0) 2021.07.24
백준 16202 - MST 게임  (0) 2021.07.23