Plite
전자오락 공방
Plite
전체 방문자
오늘
어제
  • 분류 전체보기 (274)
    • 프로젝트 (18)
      • 완성 프로젝트 (3)
      • 프로젝트 진행 내역 (15)
    • 공부 및 정리 (241)
      • 백준 코드 (222)
      • C++ (8)
      • DirectX (2)
      • Unreal Engine (6)
      • 프로그래밍 패턴 (3)
    • 기타 (12)
      • 기타 주저리 (10)
    • 게임과 취미 (1)
    • 대문 (1)

블로그 메뉴

  • 홈
  • 프로젝트
  • 취미, 일상
  • 백준 프로필

공지사항

  • [Read Me]
  • 제 블로그에 방문하신 것을 환영합니다.

인기 글

태그

  • 정수론
  • 백트래킹
  • C++
  • 최소 스패닝 트리
  • 유니온 파인드
  • 이분탐색
  • 구현
  • SCC
  • 백준
  • 문자열
  • 우선순위큐
  • LCA
  • 위상 정렬
  • 동적계획법
  • 기하
  • 스택
  • 분할정복
  • 큐
  • UC++
  • 세그먼트 트리
  • 투포인터
  • 누적합
  • 브루트포스
  • 그래프
  • 정렬
  • 트라이
  • 수학
  • 트리
  • KMP
  • 조합론

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite
공부 및 정리/백준 코드

[C++]백준 - 1774번 문제

[C++]백준 - 1774번 문제
공부 및 정리/백준 코드

[C++]백준 - 1774번 문제

2021. 10. 26. 17:04

1774번: 우주신과의 교감 (acmicpc.net)

 

1774번: 우주신과의 교감

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

www.acmicpc.net

 

1774번 : 우주신과의 교감


황선자씨는 우주신과 교감을 할수 있는 채널러 이다. 하지만 우주신은 하나만 있는 것이 아니기때문에 황선자 씨는 매번 여럿의 우주신과 교감하느라 힘이 든다. 이러던 와중에 새로운 우주신들이 황선자씨를 이용하게 되었다.

하지만 위대한 우주신들은 바로 황선자씨와 연결될 필요가 없다. 이미 황선자씨와 혹은 이미 우주신끼리 교감할 수 있는 우주신들이 있기 때문에 새로운 우주신들은 그 우주신들을 거쳐서 황선자 씨와 교감을 할 수 있다.

우주신들과의 교감은 우주신들과 황선자씨 혹은 우주신들 끼리 이어진 정신적인 통로를 통해 이루어 진다. 하지만 우주신들과 교감하는 것은 힘든 일이기 때문에 황선자씨는 이런 통로들이 긴 것을  좋아하지 않는다. 왜냐하면 통로들이 길 수록 더 힘이 들기 때문이다.

또한 우리들은 3차원 좌표계로 나타낼 수 있는 세상에 살고 있지만 우주신들과 황선자씨는 2차원 좌표계로 나타낼 수 있는 세상에 살고 있다. 통로들의 길이는 2차원 좌표계상의 거리와 같다.

이미 황선자씨와 연결된, 혹은 우주신들과 연결된 통로들이 존재한다. 우리는 황선자 씨를 도와 아직 연결이 되지 않은 우주신들을 연결해 드려야 한다. 새로 만들어야 할 정신적인 통로의 길이들이 합이 최소가 되게 통로를 만들어 “빵상”을 외칠수 있게 도와주자.

 

입력


첫째 줄에 우주신들의 개수(N<=1,000) 이미 연결된 신들과의 통로의 개수(M<=1,000)가 주어진다.

두 번째 줄부터 N개의 줄에는 황선자를 포함하여 우주신들의 좌표가 (0<= X<=1,000,000), (0<=Y<=1,000,000)가 주어진다. 그 밑으로 M개의 줄에는 이미 연결된 통로가 주어진다. 번호는 위의 입력받은 좌표들의 순서라고 생각하면 된다. 좌표는 정수이다.

 

 

출력


첫째 줄에 만들어야 할 최소의 통로 길이를 출력하라. 출력은 소수점 둘째짜리까지 출력하여라.

 

 

 


 

생각해 볼 점


4386번 문제와 완전히 동일하게 풀었습니다.

 

모든 통로의 길이를 구해서 크루스칼 알고리즘을 적용해 풀었습니다.

 

코드


#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

//에지 구조체
struct edge
{
    int a;
    int b;
    double distance;
};

//거리 구하기
double get_distance(pair<int, int> a, pair<int, int> b)
{
    double l1 = a.first - b.first;
    double l2 = a.second - b.second;
    return  sqrt(l1 * l1 + l2 * l2);
}

//비교함수 (sort)
bool cmp(edge a, edge b)
{
    return a.distance < b.distance;
}

//부모 구하기
int get_parent(int parents[], int target)
{
    while(parents[target] != target) target = parents[target];
    return target;
}

//유니온 파인드
bool set_union(int parents[], int a, int b)
{
    a = get_parent(parents, a);
    b = get_parent(parents, b);
    
    if(a == b) return false;
    parents[b] = a;
    return true;
}


int main() 
{
    int N, M;
    scanf("%d %d", &N, &M);
    
    vector<edge> v;
    pair<int, int> *god = new pair<int, int> [N];
    int *parents = new int[N];

    //노드 입력
    for(int i = 0; i < N; i++)
    {
        scanf("%d %d", &god[i].first, &god[i].second);
        parents[i] = i;
    }
    
    //모든 에지를 벡터에 저장
    for(int i = 0; i < N; i++)
    {
        for(int j = i + 1; j < N; j++)
        {
            edge e;
            e.a = i;
            e.b = j;
            e.distance = get_distance(god[i], god[j]);
            v.push_back(e);
        }
    }
    
    sort(v.begin(), v.end(), cmp);
    
    //이미 연결된 통로를 유니온으로 만듬
    for(int i = 0; i < M; i++)
    {
        int a, b;
        scanf("%d %d", &a, &b);
        a--; b--;
        a = get_parent(parents, a);
        b = get_parent(parents, b);
        parents[b] = a;
    }
    
    //크루스칼
    double result = 0;
    for(edge e : v)
    {
        if(set_union(parents, e.a, e.b)) result += e.distance;
    }
    printf("%.2lf", result);
    
    delete[] god;
    delete[] parents;
	return 0;
}

 

그 외


거.. 2007년도 문제라 그런지 빵상 아줌마가 등장을 하네요.. 옛날 생각 납니다.

저작자표시

'공부 및 정리 > 백준 코드' 카테고리의 다른 글

[C++]백준 - 15681번 문제  (0) 2021.10.27
[C++]백준 - 1024번 문제  (0) 2021.10.27
[C++]백준 - 4386번 문제  (0) 2021.10.26
[C++]백준 - 1197번 문제  (0) 2021.10.25
[C++]백준 - 11780번 문제  (0) 2021.10.25
  • 1774번 : 우주신과의 교감
  • 입력
  • 출력
  • 생각해 볼 점
  • 코드
  • 그 외
'공부 및 정리/백준 코드' 카테고리의 다른 글
  • [C++]백준 - 15681번 문제
  • [C++]백준 - 1024번 문제
  • [C++]백준 - 4386번 문제
  • [C++]백준 - 1197번 문제
Plite
Plite
개발 일지, 게임 이야기 등을 적어두는 공간입니다.

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.