본문 바로가기

알고리즘/백준

[백준] 4386번 : 별자리 만들기

728x90

4386번: 별자리 만들기

 

4386번: 별자리 만들기

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

www.acmicpc.net

🤔 문제분석

간선의 개수를 작은 것부터 하나씩 그려나아가면서 가장 짧은 간선으로 모든 노드를 연결 할 수 있는 방법은 최소신장트리이다. 최소신장 트리를 구현하기위해서 유니온-파인트 자료구조를 활용하여 문제를 해결한다.

💻 코드

import sys
from math import sqrt
input = sys.stdin.readline

def get_distance(y1, x1, y2, x2):
    y = pow(abs(int((y1*100 - y2*100)//100)), 2)
    x = pow(abs(int((x1*100 - x2*100)//100)), 2)
    return sqrt(y+x)

N = int(input())

node = []
for _ in range(N):
    a, b = map(float, input().split())
    node.append((a, b))
    
edge = []
for i in range(N):
    for j in range(i+1, N):
        y1, x1 = node[i]
        y2, x2 = node[j]
        cost = get_distance(y1, x1, y2, x2)
        edge.append((i, j, cost))

edge.sort(key=lambda x:x[2])

parent = [i for i in range(N)]

def find(v1):
    if v1 != parent[v1]:
        p1 = find(parent[v1])
        return p1
    else:
        return v1
    
def union(v1, v2):
    p1 = find(v1)
    p2 = find(v2)
    
    if p1 > p2:
        parent[p1] = p2
    else:
        parent[p2] = p1
        
ans = 0 
for n1, n2, cost in edge:
    p1 = find(n1)
    p2 = find(n2)
    if p1 != p2:
        union(p1, p2)
        ans += cost

print(round(ans, 2))
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1774번 : 우주신과의 교감  (0) 2024.03.19
[백준] 1956 : 운동  (1) 2024.03.18
[백준] 1963번 : 소수경로  (0) 2024.03.18
[백준] 6593번 : 상범 빌딩  (0) 2024.03.18
[백준] 2458번 : 키 순서  (1) 2024.03.16