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

블로그 메뉴

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

공지사항

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

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Plite

전자오락 공방

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

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

2021. 10. 26. 17:00

4386번: 별자리 만들기 (acmicpc.net)

 

4386번: 별자리 만들기

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

www.acmicpc.net

 

4386번 : 별자리 만들기


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

  • 별자리를 이루는 선은 서로 다른 두 별을 일직선으로 이은 형태이다.
  • 모든 별들은 별자리 위의 선을 통해 서로 직/간접적으로 이어져 있어야 한다.

별들이 2차원 평면 위에 놓여 있다. 선을 하나 이을 때마다 두 별 사이의 거리만큼의 비용이 든다고 할 때, 별자리를 만드는 최소 비용을 구하시오.

 

입력


첫째 줄에 별의 개수 n이 주어진다. (1 ≤ n ≤ 100)

둘째 줄부터 n개의 줄에 걸쳐 각 별의 x, y좌표가 실수 형태로 주어지며, 최대 소수점 둘째자리까지 주어진다. 좌표는 1000을 넘지 않는 양의 실수이다.

 

 

출력


첫째 줄에 정답을 출력한다. 절대/상대 오차는 10-2까지 허용한다.

 

 

 


 

생각해 볼 점


각 별들 간의 거리를 구하여 에지를 만들기만 하면, 크루스칼 알고리즘을 이용해 풀 수 있습니다.

 

 

코드


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

struct edge
{
    int a;
    int b;
    double cost;
};

bool sorting(edge a, edge b)
{
    return a.cost < b.cost;
}

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

//부모찾기
int get_parent(int parents[], int target)
{
    while(target != parents[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;
	scanf("%d", &N);
	
	int *parents = new int[N];
	pair<double, double> *stars = new pair<double, double>[N];
	for(int i = 0; i < N; i++) 
	{
	    scanf("%lf %lf", &stars[i].first, &stars[i].second);
	    parents[i] = i;
	}

    //에지 만들기
	vector<edge> v;
	for(int i = 0; i < N; i++)
	{
	    for(int j = i + 1; j < N; j++)
	    {
	        edge e;
	        e.a = i;
	        e.b = j;
	        e.cost = get_distance(stars[i], stars[j]);
	        v.push_back(e);
	    }
	}
	sort(v.begin(), v.end(), sorting);
	
	double result = 0;
	//크루스칼
	for(edge e : v)
	{
	    if(set_union(parents, e.a, e.b)) result += e.cost; 
	}
    printf("%.2lf", result);
	
	delete[] stars;
	delete[] parents;
	return 0;
}

 

그 외


 

저작자표시 (새창열림)

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

[C++]백준 - 1024번 문제  (0) 2021.10.27
[C++]백준 - 1774번 문제  (0) 2021.10.26
[C++]백준 - 1197번 문제  (0) 2021.10.25
[C++]백준 - 11780번 문제  (0) 2021.10.25
[C++]백준 - 20040번 문제  (0) 2021.10.24
    '공부 및 정리/백준 코드' 카테고리의 다른 글
    • [C++]백준 - 1024번 문제
    • [C++]백준 - 1774번 문제
    • [C++]백준 - 1197번 문제
    • [C++]백준 - 11780번 문제
    Plite
    Plite
    개발 일지, 게임 이야기 등을 적어두는 공간입니다.

    티스토리툴바