Python/백준

4386_별자리만들기

728x90

https://www.acmicpc.net/status?user_id=supersfel&problem_id=4386&from_mine=1 

 

채점 현황

 

www.acmicpc.net

 

 

이역시 유니온파인드를 활용한 크루스칼 알고리즘을 활용하여 해결하였다.

 

 

처음에 각 별들의 좌표를 받는데, 이를 활용해서 각 별간의 거리를 모두 저장해주었다.

 

각 별들에게 1번,2번 .... 이름을 붙여주고

 

1-2 간의 거리 1-3번간의 거리... 를 반복해서 n-1,n번과의 거리까지 구해준다.

 

그 후 거리순으로 배열을 정렬해준 후에, 부모가 같지 않으면 두 집합을 합쳐준다.

 

import sys
input = sys.stdin.readline

n = int(input())
star=[]
for _ in range(n):
    x,y = map(float,input().split())
    star.append((x,y))

distance=[]
for i in range(n):
    for j in range(i,n):
        if i == j:
            continue
        dist = (( star[i][1] - star[j][1] )**2 + ( star[i][0]-star[j][0])**2)**0.5
        distance.append((i+1,j+1,dist))


parents=[i for i in range(n+1)]
def find(a):
    if a == parents[a]:
        return a
    parents[a] = find(parents[a])
    return parents[a]

def union(a,b):
    a,b = find(a),find(b)

    if a > b:
        parents[a] = b
    else:
        parents[b] = a

distance.sort(key=lambda x : x[2])
result = 0
for a,b,c in distance:
    if find(a) != find(b):
        union(a,b)
        result += c
print(round(result,2))
728x90

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

17472_다리만들기2(Python,설명) 반례...?  (0) 2022.05.17
1774_우주신과의 교감  (0) 2022.05.13
1197_최소스패닝트리  (0) 2022.05.11
9372_상근이의 여행  (0) 2022.05.11
4195_친구네트워크 ...반례?  (0) 2022.05.08