728x90
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 |